Java 启动/停止可在传感器上绘制的动画事件

Java 启动/停止可在传感器上绘制的动画事件,java,android,android-studio,Java,Android,Android Studio,我使用的是我能理解的谷歌发布的文档 编辑:我制作了第二个包含动画的.xml(称为shake_动画),并更新了主java类中的引用 我认为它们可能是主java类中的问题,可能是图像视图和帧动画之间的某种冲突 package-shake.shake; /** *2016年3月24日通过墨迹创建。 */ 导入android.app.Activity; 导入android.content.Context; 导入android.graphics.drawable.AnimationDrawable; 导入

我使用的是我能理解的谷歌发布的文档 编辑:我制作了第二个包含动画的.xml(称为shake_动画),并更新了主java类中的引用

我认为它们可能是主java类中的问题,可能是图像视图和帧动画之间的某种冲突

package-shake.shake;
/**
*2016年3月24日通过墨迹创建。
*/
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.drawable.AnimationDrawable;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.hardware.SensorManager;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类主扩展活动实现SensorEventListener{
私人浮动mLastX、mLastY、mLastZ;
私有布尔最小化;
私人传感器管理器;
专用传感器mAccelerometer;
专用最终浮子噪声=(浮子)4.0;
/**
*在首次创建活动时调用。
*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
最小化=错误;
msSensorManager=(SensorManager)getSystemService(Context.SENSOR\u服务);
mAccelerometer=msSensorManager.getDefaultSensor(传感器类型\加速计);
msSensorManager.registerListener(此、mAccelerometer、SensorManager.SENSOR\u延迟\u正常);
}
受保护的void onResume(){
super.onResume();
msSensorManager.registerListener(此、mAccelerometer、SensorManager.SENSOR\u延迟\u正常);
}
受保护的void onPause(){
super.onPause();
mSensorManager.unregisterListener(此);
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//可以安全地忽略此演示
}
@凌驾
传感器更改时的公共无效(传感器事件){
//加载将承载动画和动画的ImageView
//将其背景设置为AnimationDrawable XML资源。
ImageView img=(ImageView)findViewById(R.id.1);
img.setBackgroundResource(R.drawable.shake_动画);
//获取已编译为AnimationDrawable对象的背景。
AnimationDrawable frameAnimation=(AnimationDrawable)img.getBackground();
//启动动画(默认情况下为循环播放)。
frameAnimation.start();
TextView tvX=(TextView)findViewById(R.id.x_轴);
TextView tvY=(TextView)findViewById(R.id.carries);
TextView tvZ=(TextView)findViewById(R.id.z_轴);
float x=事件值[0];
浮动y=事件值[1];
float z=事件值[2];
如果(!最小化){
mLastX=x;
mLastY=y;
mLastZ=z;
tvX.setText(“0.0”);
tvY.setText(“0.0”);
tvZ.setText(“0.0”);
最小化=真;
}否则{
浮动deltaX=Math.abs(mLastX-x);
float deltaY=Math.abs(mLastY-y);
float deltaZ=Math.abs(mLastZ-z);
如果(deltaX<噪音)deltaX=(浮动)0.0;
如果(deltaY<噪声)deltaY=(浮点)0.0;
如果(deltaZdeltaY){
frameAnimation.start();
}否则如果(deltaY>deltaX){
frameAnimation.start();
}否则{
frameAnimation.stop();
}
}
}
}
这是我的xml文件,我想这可能就是问题所在,但是google发布的页面并没有对应该放在这里的内容进行很好的描述


将动画与布局代码分开很重要

将动画列表放入可绘制文件夹中名为anime.xml的xml文件中,如下所示

<?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>

您将遇到以下错误:

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

这意味着您没有初始化
ImageView
,或者您正在传递的
setBackgroundResource(int)
参数为空。粘贴您的活动代码以清除更多错误。

编辑代码以反映您所说的内容,但仍然会出现致命错误。更新的作品。谢谢你的帮助@IanKirkpatrick不要将动画列表放在选择器中,只需将其完全按照我为您编写的方式放置,并将图像视图保留在原始布局中。我为您编写的xml是完整的文件:)刚刚去掉了选择器,它修复了它!天哪,我觉得自己很愚蠢,因为我没有早点看到!非常感谢你!你是否碰巧知道如何将动画居中?我消除了指针错误,更新了OP,但仍然有另一个致命错误…伙计,看看我的答案,看看动画可绘制,不要在动画文件中使用选择器。我写的动画可绘制文件实际上是满的,不要把你的图像放在里面,不要放任何东西,保持原样。仅将图像保留在主布局中。如果使用ID shake1将图像居中,它也将使动画居中。您可以使用Android studio精心制作的拖放UI定制:P
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setBackgroundResource(int)' on a null object reference