Android:在方向传感器Y轴(俯仰)上旋转位图时出现问题
你好,我在这方面急需帮助,我有一个方向盘的图像,我想在手机向左或向右倾斜时旋转它。我的应用程序处于横向模式。您应该看到下面的代码。问题是位图不旋转,并且在不同的位置重新绘制。我找不到这个问题Android:在方向传感器Y轴(俯仰)上旋转位图时出现问题,android,bitmap,draw,android-sensors,rotateanimation,Android,Bitmap,Draw,Android Sensors,Rotateanimation,你好,我在这方面急需帮助,我有一个方向盘的图像,我想在手机向左或向右倾斜时旋转它。我的应用程序处于横向模式。您应该看到下面的代码。问题是位图不旋转,并且在不同的位置重新绘制。我找不到这个问题 public class Accelerometer extends Activity { mySteering steering = null; private static SensorManager mySensorManager; private boolean sensorrunning;
public class Accelerometer extends Activity {
mySteering steering = null;
private static SensorManager mySensorManager;
private boolean sensorrunning;
public float y;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
steering = new mySteering(this);
setContentView(steering);
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
sensorrunning = true;
Toast.makeText(this, "Start ORIENTATION Sensor", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(this, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
sensorrunning = false;
finish();
}
}
private SensorEventListener mySensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
y = event.values[1];
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(sensorrunning){
mySensorManager.unregisterListener(mySensorEventListener);
Toast.makeText(Accelerometer.this, "unregisterListener", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
public class mySteering extends View {
static final int width = 50;
static final int height = 50;
Accelerometer sensor = new Accelerometer();
Matrix rot = new Matrix();
public mySteering(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.steering);
Paint p = new Paint(); // set some paint options
p.setColor(Color.WHITE);
int canvasWidth = canvas.getWidth();
int canvasHeight = canvas.getHeight();
int centreX = (canvasWidth) / 2;
int centreY = (canvasHeight) / 2;
canvas.drawText("This is on Y " + sensor.y, 5, 40, p);
if (sensor.y <= 12.0 && sensor.y >= -12.0) {
canvas.drawBitmap(bmp, centreX, centreY, null);
invalidate();
}
if (sensor.y > 20.0 && sensor.y < 0.0) {
rot.setRotate(45, centreX, centreY);
canvas.drawBitmap(bmp, rot, p);
invalidate();
}
if (sensor.y < -20.0 && sensor.y > 0.0 ) {
rot.setRotate(-45, centreX, centreY);
canvas.drawBitmap(bmp, rot, p);
invalidate();
}
公共类活动{
mySteering转向=零;
专用静态传感器管理器mySensorManager;
私有布尔运算;
公众浮躁;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
转向=新转向(本);
setContentView(转向);
mySensorManager=(SensorManager)getSystemService(Context.SENSOR\u SERVICE);
List mySensors=mySensorManager.getSensorList(Sensor.TYPE_方向);
如果(mySensors.size()>0){
mySensorManager.registerListener(mysensorreventListener、mySensors.get(0)、SensorManager.SENSOR\u DELAY\u NORMAL);
sensorrunning=true;
Toast.makeText(这是“开始方向传感器”,Toast.LENGTH_LONG.show();
}
否则{
Toast.makeText(这是“无方向传感器”,Toast.LENGTH_LONG).show();
sensorrunning=false;
完成();
}
}
私有SensorEventListener mySensorEventListener=新的SensorEventListener(){
@凌驾
传感器更改时的公共无效(传感器事件){
//TODO自动生成的方法存根
y=事件值[1];
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//TODO自动生成的方法存根
}
};
@凌驾
受保护的空onDestroy(){
//TODO自动生成的方法存根
super.ondestory();
如果(传感器正在运行){
mySensorManager.unregisterListener(mySensorEventListener);
Toast.makeText(accelerator.this,“unregisterListener”,Toast.LENGTH_SHORT.show();
}
}
@凌驾
受保护的void onStart(){
//TODO自动生成的方法存根
super.onStart();
}
公共类mySteering扩展了视图{
静态最终整数宽度=50;
静态最终内部高度=50;
加速计传感器=新加速计();
矩阵rot=新矩阵();
公共mySteering(上下文){
超级(上下文);
}
受保护的void onDraw(画布){
位图bmp=BitmapFactory.decodeResource(getResources(),
R.可牵引转向);
Paint p=new Paint();//设置一些绘制选项
p、 setColor(Color.WHITE);
int canvasWidth=canvas.getWidth();
int canvasHeight=canvas.getHeight();
int centreX=(画布宽度)/2;
int centreY=(画布高度)/2;
画布.drawText(“这是在Y上”+传感器.Y,5,40,p);
如果(传感器y=-12.0){
drawBitmap(bmp、centreX、centreY、null);
使无效();
}
如果(传感器y>20.0和传感器y<0.0){
rot.setRotate(45,centreX,centreY);
绘制位图(bmp,rot,p);
使无效();
}
如果(传感器y<-20.0和传感器y>0.0){
rot.setRotate(-45,centreX,centreY);
绘制位图(bmp,rot,p);
使无效();
}
有人能找出或修改代码中的错误吗?提前谢谢。
这就是它这次看起来的样子,没有旋转,甚至没有重新绘制
您可能必须按如下方式传递传感器值:
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
steering.sensor = this;
y = event.values[1];
steering.invalidate();
}
使用parameter sensor将public void中的steering.sensor设置为AccuracyChanged(sensor sensor,int Accurance)方法,并在那里使转向无效。很抱歉,我没有理解您所说的内容。类型不匹配:无法从新的SensorEventListener()转换{}要使用加速度计,请尝试以下操作:-steering.sensor=Accelerator。这;感谢它可以工作,但当方向盘旋转到if语句上的给定角度时,另一个问题仍然存在,它会在不同的位置上重新绘制。如何在相同的位置旋转位图,而不让它一次又一次地绘制?pro我看到的问题是,我的centreX和centerY在旋转时不断变化。我应该如何修复它们,并在屏幕中心绘制位图,而不考虑传感器?