android按钮旋转与设备方向

android按钮旋转与设备方向,android,button,overriding,sensors,extend,Android,Button,Overriding,Sensors,Extend,在我的android应用程序中,当我旋转/倾斜我的设备时,我想以相反的方向旋转我的按钮控件,以补偿设备的方向。有点像android中的屏幕定位 这是我的传感器类别: @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub synchronized (this) { double alpha = 0.8; double

在我的android应用程序中,当我旋转/倾斜我的设备时,我想以相反的方向旋转我的按钮控件,以补偿设备的方向。有点像android中的屏幕定位

这是我的传感器类别:

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    synchronized (this) {
        double alpha = 0.8;
        double gravity[] = new double[3];
        switch (event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                // alpha is calculated as t / (t + dT)
                // with t, the low-pass filter's time-constant
                // and dT, the event delivery rate                                  
                //gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
                //gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
                //gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

                //sensorX = event.values[0] - gravity[0];
                //sensorY = event.values[1] - gravity[1];
                //sensorZ = event.values[2] - gravity[2];
                    //ignore this section!
            break;
        case Sensor.TYPE_ORIENTATION:   
                sensorZ = event.values[0];
                sensorX = event.values[1];
                sensorY = event.values[2];
                outputZ.setText("Z:"+Float.toString(event.values[0]));
                outputX.setText("X:"+Float.toString(event.values[1]));
                outputY.setText("Y:"+Float.toString(event.values[2]));
                //Toast.makeText(getApplicationContext(), "SWITCH TO ",Toast.LENGTH_LONG).show();
                //RelativeLayout s_r_t = (RelativeLayout) findViewById(R.id.snap_r_t);
                //RotateView r_flash = new RotateView(this , s_r_t.getWidth(), s_r_t.getHeight(), 90)(RotateView) findViewById(R.id.flash);
                //RotateView r_flash = new RotateView(this , s_r_t.getWidth(), s_r_t.getHeight(), 90);
                s_r_t.addView(r_flash);
                //s_r_t.setLayoutParams(params)
                //flash.getWidth();
                //flash.getHeight();

        break;

        }
    }

}
连同我的扩展按钮:

 public class RotateView extends Button {

private float cx,cy;
private double degree;
private Button button;

public RotateView(Context context , int x, int y, double deg) {
    super(context);     
    cx = (float)x/2;
    cy = (float)y/2;
    degree = deg;
}

public RotateView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onDraw(Canvas canvas) {
     canvas.save();
     canvas.rotate((float)degree,cx,cy);
     super.onDraw(canvas);
     canvas.restore();

}

}
如何使用扩展按钮类创建按钮

这是我的按钮:

 flash = (Button)findViewById(R.id.flash);
基本上,这就是我想要实现的(伪代码):


如果可能的话,请给出完整的代码片段,我已经看到许多答案几乎回答了我的问题,但是缺少了如何在我的主类中将扩展按钮实现回我的按钮的基本部分。

为了将来的参考,请遵循安卓开发人员关于自定义组件的指南

    ImageButton button= (ImageButton) findViewById(R.id.test_image);
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
    Matrix mat = new Matrix();
    mat.postRotate(deg);
    Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true);
    button.setImageBitmap(bMapRotate);
在我的例子中,我忘了添加xml布局

程序如下->

  • 为组件创建一个类,然后覆盖我要更改的零件

    在这种情况下:

    void setValue(double deg) {//this changes the rotation of canvas....
        degree = deg;
    }
    
  • 为自定义类添加xml

  • 在“我的活动”中查找视图并进行更改

  • 完成

    您可以使用
    按钮。动画()。旋转(度)

    不,这不是我想要实现的,如果我每一毫秒更改一次位图,就会出现性能问题。事实上,它确实达到了我想要的效果,但是在传感器中每“一次更改”旋转一次位图对设备来说太多了,有其他选择吗?无论如何,我找到了解决方案:)
    void setValue(double deg) {//this changes the rotation of canvas....
        degree = deg;
    }