设为首页 加入收藏

TOP

Android实现图片随手指旋转功能(一)
2014-11-24 07:40:28 来源: 作者: 【 】 浏览:1
Tags:Android 实现 图片 手指 旋转 功能

在View中进行重绘,主要是通过计算角度及距离来实现。实现类代码如下:


package com.example.roatedemo;


public class RotateView extends View {
private Paint mPaint = new Paint();
private Bitmap bitmaplittele;//中间不动的图片
private Bitmap bitmapBig;//随手指转动的图片
private Bitmap bitmapOut;//外围不动的图片
// 圆心坐标
private float mPointX = 0, mPointY = 0;


private int flag = 0;
// 半径
private int mRadius = 0;
// 旋转角度
private int mAngle = 0;
private int beginAngle = 0, currentAngle = 0;
private String TAG = "NewView";
int bitMap[] = { R.drawable.circle0, R.drawable.circle1, R.drawable.circle2 };
int imageIndex = 0;
boolean isUp = false,isTouch=false;
Context mContext;
RotateViewListener listener;
long beginTime,endTime;
Calendar now;


public RotateView(Context context, int px, int py, int radius,RotateViewListener listener) {
super(context);
mContext = context;
this.listener = listener;
mPointX = px;
mPointY = py;
mRadius = radius;
bitmaplittele = BitmapFactory.decodeResource(getResources(),
R.drawable.a1_pointer).copy(Bitmap.Config.ARGB_8888, true);
bitmapBig = BitmapFactory.decodeResource(getResources(), bitMap[0])
.copy(Bitmap.Config.ARGB_8888, true);
bitmapOut = BitmapFactory.decodeResource(getResources(),
R.drawable.bigcir).copy(Bitmap.Config.ARGB_8888, true);
setBackgroundResource(R.drawable.back);
Log.e(TAG, "RotateViewBegin");
}


@Override
public boolean dispatchTouchEvent(MotionEvent e) {
switch (e.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
now = Calendar.getInstance();
beginTime = now.getTimeInMillis();
beginAngle = computeCurrentAngle(e.getX(), e.getY());
isUp = false;
//如果点击触摸范围在圈外,则不处理
if (getDistance(e.getX(), e.getY())>bitmapOut.getWidth()/2) {
isTouch=false;
}else {
isTouch=true;
}
return true;
case MotionEvent.ACTION_MOVE:
if (!isTouch) {
return true;
}
currentAngle = computeCurrentAngle(e.getX(), e.getY());
invalidate();
return true;
case MotionEvent.ACTION_UP:
isUp = true;
if (!isTouch) {
return true;
}
now = Calendar.getInstance();
endTime = now.getTimeInMillis();
if (SetClick(e.getX(), e.getY())) {
return true;
}
if (mAngle > 0) {
int count = mAngle / 120 + (mAngle % 120 > 60 1 : 0);
imageIndex = (imageIndex + count) % 3;
} else if (mAngle < 0) {
mAngle = -mAngle;
int count = mAngle / 120 + (mAngle % 120 > 60 1 : 0);
imageIndex = (imageIndex + 3 - count) % 3;
}
bitmapBig = BitmapFactory.decodeResource(getResources(),
bitMap[imageIndex]).copy(Bitmap.Config.ARGB_8888, true);
bitmapBig = adjustPhotoRotation(bitmapBig, imageIndex * 120);
invalidate();
if (mAngle >= 60) {
listener.onModChange(imageIndex);
}
return true;
}


return false;
}


@Override
public void onDraw(Canvas canvas) {
// Log.i(TAG, "onDraw");
// 大圆
drawInCenter(canvas, bitmapOut, mPointX, mPointY, TAG);
// 外圈
if (isUp) {
mAngle = 0;
} else {
mAngle = currentAngle - beginAngle;
}


Bitmap tempBig = adjustPhotoRotation(bitmapBig, mAngle);
// Log.i(TAG, "mAngle:"+mAngle);
drawInCenter(canvas, tempBig, mPointX, mPointY + 10, TAG);
// 小圆(中间的圆心)
drawInCenter(canvas, bitmaplittele, mPointX, mPointY - 10, TAG);
}


Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) {
if (orientationDegree == 0) {
return bm;
}
Matrix m = new Matrix();
m.setRotate(orientationDegree, (float) bm.getWidth() / 2,
(float) bm.getHeight()

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇APK一个反编译利器Apktool 下一篇Android JavaMail发送邮件(可发..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 并发工具类:提 (2025-12-25 20:25:44)
·Java面试技巧:如何 (2025-12-25 20:25:41)
·Java并发编程中的线 (2025-12-25 20:25:38)
·C 语言 - cppreferen (2025-12-25 19:50:27)
·《C 语言入门教程》 (2025-12-25 19:50:23)