参数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);
}
}
来源:修改相机中的缩放图,使其能够平滑旋转。