Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式旋转可绘图或视图_Java_Android_Rotation - Fatal编程技术网

Java 以编程方式旋转可绘图或视图

Java 以编程方式旋转可绘图或视图,java,android,rotation,Java,Android,Rotation,deltaangle不超过0.1,我不确定提取值是多少。由于您试图使用Almero的Android手势检测器,我决定也这样做,以便找到合适的解决方案: private class RotateListener implements RotateGestureDetector.OnRotateGestureListener{ @Override public boolean onRotate(MotionEvent event1, MotionEvent event2,

deltaangle
不超过0.1,我不确定提取值是多少。

由于您试图使用Almero的Android手势检测器,我决定也这样做,以便找到合适的解决方案:

private class RotateListener implements RotateGestureDetector.OnRotateGestureListener{
    @Override
    public boolean onRotate(MotionEvent event1, MotionEvent event2,
            double deltaAngle) {

        return true;
    }
}
这对我来说很好(我可以用两个手指旋转手势来旋转ImageView。 注意:别忘了选择合适的旋转方法调用。我对这两种方法都进行了注释以引起您的注意。 旋转比只是一个乘数,可以加速我手指的旋转反应。 可以对视图使用任何旋转轴(setRotation()、setRotationX()和setRotationY())方法。


要在API级别低于11的Android设备(蜂窝设备之前)上支持此代码,您可能需要使用NineodelDroid库。

以下代码围绕其中心旋转图像视图:

public class MainActivity extends Activity {

    private RotateGestureDetector mRotateDetector;
    private float mRotationDegrees = 0.f;
    private static final float ROTATION_RATIO = 2;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRotateDetector = new RotateGestureDetector(getApplicationContext(), new RotateListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mRotateDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    private class RotateListener extends RotateGestureDetector.SimpleOnRotateGestureListener {
        @Override
        public boolean onRotate(RotateGestureDetector detector) {
            mRotationDegrees -= detector.getRotationDegreesDelta();
            ImageView v = (ImageView) findViewById(R.id.imageView);
            // For NineOldAndroids library only!
            ViewHelper.setRotation(v, mRotationDegrees * ROTATION_RATIO);
            // For HONEYCOMB and later only!
            v.setRotation(mRotationDegrees * ROTATION_RATIO);
            return true;
        }
    }
}

下面是一个很好的解决方案,用于为imageView放置旋转的可绘制图形:

ImageView myImageView = (ImageView)findViewById(R.id.my_imageview);

AnimationSet animSet = new AnimationSet(true);
animSet.setInterpolator(new DecelerateInterpolator());
animSet.setFillAfter(true);
animSet.setFillEnabled(true);

final RotateAnimation animRotate = new RotateAnimation(0.0f, -90.0f,
    RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5f);

animRotate.setDuration(1500);
animRotate.setFillAfter(true);
animSet.addAnimation(animRotate);

myImageView.startAnimation(animSet);
用法:

Drawable getRotateDrawable(final Bitmap b, final float angle) {
    final BitmapDrawable drawable = new BitmapDrawable(getResources(), b) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, b.getWidth() / 2, b.getHeight() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
    return drawable;
}
另一种选择:

Bitmap b=...
float angle=...
final Drawable rotatedDrawable = getRotateDrawable(b,angle);
root.setImageDrawable(rotatedDrawable);

另外,如果你想旋转位图,但害怕OOM,你可以使用我制作的NDK解决方案

@baboo它不起作用这对修复有好处,但我想要的是当我检测到旋转手势时的动态最终旋转动画rotate=新旋转动画(0.0f,360.0f,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f);非常不可恢复的解决方案!!因为您正在重新实现“draw”功能,每次需要更新可绘制文件时,它都会被旋转。@Corbella说得通,这里的问题是什么?
Bitmap b=...
float angle=...
final Drawable rotatedDrawable = getRotateDrawable(b,angle);
root.setImageDrawable(rotatedDrawable);
private Drawable getRotateDrawable(final Drawable d, final float angle) {
    final Drawable[] arD = { d };
    return new LayerDrawable(arD) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, d.getBounds().width() / 2, d.getBounds().height() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
}