![【移动应用开发技术】怎么在Android中实现一个图片随手指旋转功能_第1页](http://file4.renrendoc.com/view/2082a46389c688233ee681b7ab2d7e08/2082a46389c688233ee681b7ab2d7e081.gif)
![【移动应用开发技术】怎么在Android中实现一个图片随手指旋转功能_第2页](http://file4.renrendoc.com/view/2082a46389c688233ee681b7ab2d7e08/2082a46389c688233ee681b7ab2d7e082.gif)
![【移动应用开发技术】怎么在Android中实现一个图片随手指旋转功能_第3页](http://file4.renrendoc.com/view/2082a46389c688233ee681b7ab2d7e08/2082a46389c688233ee681b7ab2d7e083.gif)
![【移动应用开发技术】怎么在Android中实现一个图片随手指旋转功能_第4页](http://file4.renrendoc.com/view/2082a46389c688233ee681b7ab2d7e08/2082a46389c688233ee681b7ab2d7e084.gif)
![【移动应用开发技术】怎么在Android中实现一个图片随手指旋转功能_第5页](http://file4.renrendoc.com/view/2082a46389c688233ee681b7ab2d7e08/2082a46389c688233ee681b7ab2d7e085.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中实现一个图片随手指旋转功能
这篇文章主要为大家详细介绍了怎么在Android中实现一个图片随手指旋转功能,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:在View中进行重绘,主要是通过计算角度及距离来实现。实现类代码如下:package
com.example.roatedemo;
import
java.util.Calendar;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.graphics.Canvas;
import
android.graphics.Matrix;
import
android.graphics.Paint;
import
android.util.Log;
import
android.view.MotionEvent;
import
android.view.View;
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()
/
2);
try
{
Bitmap
bm1
=
Bitmap.createBitmap(bm,
0,
0,
bm.getWidth(),
bm.getHeight(),
m,
true);
return
bm1;
}
catch
(OutOfMemoryError
ex)
{
}
return
null;
}
private
void
drawInCenter(Canvas
canvas,
Bitmap
bitmap,
float
left,
float
top,
String
text)
{
canvas.drawBitmap(bitmap,
left
-
bitmap.getWidth()
/
2,
top
-
bitmap.getHeight()
/
2,
null);
}
//
子控件位置改变重新计算角度
private
int
computeCurrentAngle(float
x,
float
y)
{
//
根据圆心坐标计算角度
float
distance
=
(float)
Math
.sqrt(((x
-
mPointX)
*
(x
-
mPointX)
+
(y
-
mPointY)
*
(y
-
mPointY)));
int
degree
=
(int)
(Math.acos((x
-
mPointX)
/
distance)
*
180
/
Math.PI);
if
(y
<
mPointY)
{
degree
=
-degree;
}
if
(degree
<
0)
{
degree
+=
360;
}
//
Log.i("RoundSpinView",
"x:"
+
x
+
",y:"
+
y
+
",degree:"
+
degree);
return
degree;
}
//
获取距离圆心的距离
private
float
getDistance(float
x,
float
y)
{
//
根据圆心坐标计算角度
float
distance
=
(float)
Math
.sqrt(((x
-
mPointX)
*
(x
-
mPointX)
+
(y
-
mPointY)
*
(y
-
mPointY)));
return
distance;
}
//点击
private
boolean
SetClick(float
x,
float
y)
{
float
distance
=
getDistance(x,
y);
if
(mAngle>10||mAngle<-10)
{
return
false;
}else
if(endTime-beginTime>1000){
return
false;
}
if
(distance
<
bitmapBig.getWidth()
/
2)
{
int
mod
=
0;
if
(beginAngle
<
90
||
330
<
beginAngle)
{
mod
=
(imageIndex+3-1)%3;
}
else
if
(90
<
beginAngle
&&
210
>
beginAngle)
{
mod
=
(imageIndex+3-2)%3;
}
else{
mod
=
imageIndex;
}
//回调到主界面进行处理。
listener.onModClick(mod);
}
return
true;
}
public
interface
RotateViewListener
{
void
onModClick(int
mode);
void
onModChange(int
mode);
}
}
Activity中调用代码:package
com.example.roatedemo;
import
com.example.roatedemo.RotateView.RotateViewListener;
import
android.app.Activity;
import
android.content.Context;
import
android.os.Bundle;
import
android.util.DisplayMetrics;
import
android.util.Log;
import
android.widget.Toast;
public
class
MainActivity
extends
Activity
implements
RotateViewListener{
RotateView
rotateView;
String
TAG="MainActivity";
Context
mContext;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
mContext
=
this;
int
height,width;
DisplayMetrics
displayMet
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七年级数学上册第30课时销售问题和储蓄问题听评课记录新湘教版
- 湘教版数学八年级上册《1.1 分式》听评课记录
- 人教版历史七年级下册第1课《隋朝的统一与灭亡》听课评课记录
- 2022年新课标八年级上册道德与法治《7.1 关爱他人 》听课评课记录
- 生物技术创新合作开发合同(2篇)
- 理财委托合同(2篇)
- 人教版数学八年级下册20.1.1《平均数》听评课记录3
- 语文听评课记录九年级
- 人教版数学八年级上册《11.2.2三角形的外角》听评课记录1
- 数学七年级下学期《立方根》听评课记录
- 安全安全技术交底模板
- 房屋建筑工程投标方案(技术方案)
- 部编版一年级语文下册语文园地五《单元拓展-字族文》教学设计
- 静脉输液法操作并发症的预防及处理
- 牙外伤的远期并发症监测
- 2025年高考语文作文备考:议论文万能模板
- 重大事故隐患判定标准与相关事故案例培训课件(建筑)
- 《我的寒假生活》
- DZ/T 0430-2023 固体矿产资源储量核实报告编写规范(正式版)
- (高清版)WST 442-2024 临床实验室生物安全指南
- 历史时间轴全
评论
0/150
提交评论