android按钮旋转与设备方向
在我的android应用程序中,当我旋转/倾斜我的设备时,我想以相反的方向旋转我的按钮控件,以补偿设备的方向。有点像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
@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;
}
按钮。动画()。旋转(度) 不,这不是我想要实现的,如果我每一毫秒更改一次位图,就会出现性能问题。事实上,它确实达到了我想要的效果,但是在传感器中每“一次更改”旋转一次位图对设备来说太多了,有其他选择吗?无论如何,我找到了解决方案:)
void setValue(double deg) {//this changes the rotation of canvas....
degree = deg;
}