2016-04-12 16 views
0

私は、google here によって投稿されたドキュメントを理解していました。EDIT:アニメーションを含む2番目の.xml(shake_animation)を作成し、メインJavaクラスセンサーイベントでアニメーションを開始/停止する

私は彼らの問題はメインのJavaクラスにあるかもしれないと思っています。おそらく、画像ビューとframeAnimationの間に何らかの衝突がありますか?

package shake.shake; 

/** 
* Created by ink on 3/24/16. 
*/ 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.drawable.AnimationDrawable; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class main extends Activity implements SensorEventListener { 
    private float mLastX, mLastY, mLastZ; 
    private boolean mInitialized; 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 

    private final float NOISE = (float) 4.0; 


    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mInitialized = false; 
     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 
    protected void onResume() { 
     super.onResume(); 
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    protected void onPause() { 
     super.onPause(); 
     mSensorManager.unregisterListener(this); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
// can be safely ignored for this demo 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // Load the ImageView that will host the animation and 
     // set its background to our AnimationDrawable XML resource. 
     ImageView img = (ImageView)findViewById(R.id.shake1); 
     img.setBackgroundResource(R.drawable.shake_animation); 

     // Get the background, which has been compiled to an AnimationDrawable object. 
     AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); 

     // Start the animation (looped playback by default). 
     frameAnimation.start(); 

     TextView tvX= (TextView)findViewById(R.id.x_axis); 
     TextView tvY= (TextView)findViewById(R.id.calories); 
     TextView tvZ= (TextView)findViewById(R.id.z_axis); 
     float x = event.values[0]; 
     float y = event.values[1]; 
     float z = event.values[2]; 
     if (!mInitialized) { 
      mLastX = x; 
      mLastY = y; 
      mLastZ = z; 
      tvX.setText("0.0"); 
      tvY.setText("0.0"); 
      tvZ.setText("0.0"); 
      mInitialized = true; 
     } else { 
      float deltaX = Math.abs(mLastX - x); 
      float deltaY = Math.abs(mLastY - y); 
      float deltaZ = Math.abs(mLastZ - z); 
      if (deltaX < NOISE) deltaX = (float)0.0; 
      if (deltaY < NOISE) deltaY = (float)0.0; 
      if (deltaZ < NOISE) deltaZ = (float)0.0; 
      mLastX = x; 
      mLastY = y; 
      mLastZ = z; 
      tvX.setText(Float.toString(deltaX)); 
      tvY.setText(Float.toString(deltaY)); 
      tvZ.setText(Float.toString(deltaZ)); 
      if (deltaX > deltaY) { 
       frameAnimation.start(); 
      } else if (deltaY > deltaX) { 
       frameAnimation.start(); 
      } else { 
       frameAnimation.stop(); 
      } 
     } 
    } 
    } 

は、ここで私は、問題がどこにあるか、これがかもしれないと思う、私のxmlファイルだが、出してページのGoogleはここ

<?xml version="1.0" encoding="utf-8"?> 
 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
 

 
    <ImageView 
 
     android:id="@+id/shake1" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:layout_centerHorizontal="true" 
 
     android:layout_centerVertical="true" 
 
     android:background="@drawable/shake1" /> 
 

 
    <item 
 
     android:duration="50" 
 
     android:drawable="@drawable/shake1"/> 
 

 
    <item 
 
     android:duration="50" 
 
     android:drawable="@drawable/shake1"/> 
 
    <item 
 
     android:duration="50" 
 
     android:drawable="@drawable/shake2"/> 
 

 
    <item 
 
     android:duration="50" 
 
     android:drawable="@drawable/shake3"/> 
 

 
    <item 
 
     android:duration="50" 
 
     android:drawable="@drawable/shake4"/> 
 
</selector>
を置くべきであるかのような偉大な説明を持っていませんでした

はここでlogcat(更新)です:

04-12 01:18:57.824 2081-2081/shake.shake E/AndroidRuntime: FATAL EXCEPTION: main 
 
                  Process: shake.shake, PID: 2081 
 
                  java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.AnimationDrawable 
 
                   at shake.shake.main.onSensorChanged(main.java:62) 
 
                   at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:481) 
 
                   at android.os.MessageQueue.nativePollOnce(Native Method) 
 
                   at android.os.MessageQueue.next(MessageQueue.java:323) 
 
                   at android.os.Looper.loop(Looper.java:135) 
 
                   at android.app.ActivityThread.main(ActivityThread.java:5422) 
 
                   at java.lang.reflect.Method.invoke(Native Method) 
 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

ここにあなたのレイアウトコードからアニメーションを分離することが重要である描画可能リストの.xml

<?xml version="1.0" encoding="utf-8"?> 
 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <animation-list android:id="@+id/shake_animation" android:oneshot="false"> 
 
     <item android:drawable="@drawable/shake1" android:duration="50" /> 
 
     <item android:drawable="@drawable/shake2" android:duration="50" /> 
 
     <item android:drawable="@drawable/shake3" android:duration="50" /> 
 
     <item android:drawable="@drawable/shake4" android:duration="50" /> 
 
    </animation-list> 
 
    <image 
 
     android:id="@+id/shake1" 
 
     android:src="@drawable/shake1" 
 
     /> 
 
</selector>

+0

メイト、私の答えを見て、アニメーションのdrawableを見て、あなたのアニメーションファイルでセレクタを使用しないでください。私が書いたアニメーション描画可能ファイルは、文字通りいっぱいです。イメージを置いたり、何も入れたりしないでそのまま残してください。メインのレイアウトにのみ画像を保存してください。 – gedo

+0

ID shake1の画像を中央に配置すると、アニメーションも中央に配置されます。あなたはAndroidスタジオのうまく作成されたドラッグアンドドロップのUIカスタマイズを使用することができます:P – gedo

答えて

0

です。

この

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
android:oneshot="true"> 
    <item android:drawable="@drawable/shake1" android:duration="50" /> 
    <item android:drawable="@drawable/shake2" android:duration="50" /> 
    <item android:drawable="@drawable/shake3" android:duration="50" /> 
    <item android:drawable="@drawable/shake4" android:duration="50" /> 
</animation-list> 

のように、あなたの描画可能なフォルダにanime.xmlと呼ばれるXMLファイルにアニメーションのリストを入れて、あなたはこのエラーを取得している

ImageView img = (ImageView) findViewById(R.id.shake1); 
    img.setBackgroundResource(R.drawable.anime); 
    AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); 
+0

あなたが言ったことを反映するように編集されたコードは、まだ致命的なエラーを取得します。 OPを更新しました。助けてくれてありがとう! –

+0

@IanKirkpatrickセレクタにアニメーションリストを入れないでください。ちょうど私があなたのためにそれを書いたとおりに置いて、元のレイアウトの中にイメージビューを残してください。あなたのために書いたxmlは完全なファイルです:) – gedo

+0

はセレクタを取り除き、それを修正しました!神様、私は早くそれを見ていないために馬鹿だと感じる! ありがとうございました! アニメーションを中央に配置する方法を偶然知っていますか? –

0

次Javaコードの使用を持っています:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setBackgroundResource(int)' on a null object reference 

これはあなたがどちらかを初期化していないことを意味し3210または渡す引数setBackgroundResource(int)がnullです。エラーをより明確にするために、アクティビティコードを貼り付けます。

+0

貼り付け、誤って編集しました... –

+0

ポインタエラーを取り除き、OPを更新しましたが、まだ別の致命的なエラーが発生しました... –

関連する問題