Android 绘制rotate控件图像

    xiaoxiao2026-09-23  17

           参数degree是手机旋转的角度,通过系统方法可得到;animation是否需要动画。该View作为一个控件使用,需要在程序中通过调用setOrientation()方法,来使其产生作用。

    <span style="font-family:Arial;font-size:18px;"><span style="font-size:18px;"> public class RotatelView extends View {     private static final int ANIMATION_SPEED = 270; private int mCurrentDegree = 0; // [0, 359] private int mStartDegree = 0; private int mTargetDegree = 0; private boolean mClockwise = false; private boolean mEnableAnimation = true; private long mAnimationStartTime = 0; private long mAnimationEndTime = 0; public void setOrientation(int degree, boolean animation) { mEnableAnimation = animation; // make sure in the range of [0, 359] degree = degree >= 0 ? degree % 360 : degree % 360 + 360; if (degree == mTargetDegree) return; mTargetDegree = degree; if (mEnableAnimation) { mStartDegree = mCurrentDegree; mAnimationStartTime = AnimationUtils.currentAnimationTimeMillis(); int diff = mTargetDegree - mCurrentDegree; diff = diff >= 0 ? diff : 360 + diff; // make it in range [0, 359] // Make it in range [-179, 180]. That's the shorted distance between the // two angles diff = diff > 180 ? diff - 360 : diff; mClockwise = diff >= 0; mAnimationEndTime = mAnimationStartTime + Math.abs(diff) * 1000 / ANIMATION_SPEED; } else { mCurrentDegree = mTargetDegree; } invalidate(); }  @Override protected void onDraw(Canvas canvas) { if (mCurrentDegree != mTargetDegree) { long time = AnimationUtils.currentAnimationTimeMillis(); if (time < mAnimationEndTime) { int deltaTime = (int) (time - mAnimationStartTime); int degree = mStartDegree + ANIMATION_SPEED * (mClockwise ? deltaTime : -deltaTime) / 1000; degree = degree >= 0 ? degree % 360 : degree % 360 + 360; mCurrentDegree = degree; invalidate(); } else { mCurrentDegree = mTargetDegree; } } canvas.rotate((float) -mCurrentDegree); super.onDraw(canvas);     } }

    来源:修改相机中的缩放图,使其能够平滑旋转。

    转载请注明原文地址: https://ju.6miu.com/read-1312244.html
    最新回复(0)