android实现图片触摸旋转
2015-06-09 00:18
393 查看
1.先上一张模拟触摸旋转的效果图。
2.下面是具体的实现,自定义Rview控件类继承View,首先自定义Rview的属性,在项目文件的res/values目录下新建attr.xml文件。
attr.xml
其次,在Rview里重写构造函数,onDraw(),onTouchEvent()方法。
Rview.Java
下面对于Rview类中的mDegree()和rotate()方法,给出一张分析图。
3.在布局文件中,使用Rview。
activity_main.xml
MainActivity.java
5.chuyin.png图片放到res/drawable目录下。
6.运行APP后就可以触摸图片转动它啦!
2.下面是具体的实现,自定义Rview控件类继承View,首先自定义Rview的属性,在项目文件的res/values目录下新建attr.xml文件。
attr.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Rview"> <attr name="src" format="reference" /> <!-- 用于缩放旋转的图标 --> </declare-styleable> </resources>
其次,在Rview里重写构造函数,onDraw(),onTouchEvent()方法。
Rview.Java
<pre name="code" class="java">package com.example.liutao.test; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by liutao on 2015/6/8. */ public class Rview extends View { private Bitmap mbitmap;//图片的位图 public float mdegree = 0;//图片旋转角度,初始化为0 private Matrix matrix = new Matrix();//用来旋转图片的矩阵 private float viewHalfWidth;//画布宽度的一半 private float viewHalfHeight;//画布高度的一半 private PointF mCurMove = new PointF();//触摸点现在的坐标 private PointF viewCenter = new PointF();//组件的中心点坐标 public Rview(Context context, AttributeSet attr) { super(context, attr); //mTyped获取布局文件中控件的属性参数数组 TypedArray mTyped = getContext().obtainStyledAttributes(attr, R.styleable.Rview); //src获取数组中的图片参数 Drawable src = mTyped.getDrawable(R.styleable.Rview_src); //获取图片的位图形式 if (src instanceof BitmapDrawable) { BitmapDrawable bd = (BitmapDrawable) src; this.mbitmap = bd.getBitmap(); } //数组回收,以供下次使用 mTyped.recycle(); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mbitmap == null) return; //绘制图片 canvas.drawBitmap(mbitmap, matrix, null); viewHalfWidth = canvas.getWidth() / 2; viewHalfHeight = canvas.getHeight() / 2; //画布的1/2宽度为中心点的X坐标,1/2高度为中心点的Y坐标 viewCenter.set(viewHalfWidth, viewHalfHeight); } //响应控件的触摸事件 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { //如果手指按下或者移动,那么图片也随之相应地旋转 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: //设置现在手指触摸点的坐标 mCurMove.set(event.getX(), event.getY()); mDegree(mCurMove); rotate(mdegree); break; //如果手指抬起,则停止响应触摸事件 case MotionEvent.ACTION_UP: break; } return true; } //计算应该旋转的角度 public void mDegree(PointF cur) { //mDegree是图片旋转角度 //获取触摸点和中心点分别在水平和竖直方向的距离 float x = cur.x - viewCenter.x; float y = cur.y - viewCenter.y; //特殊情况,y=0 if (y == 0) { if (x > 0) { mdegree = -90; } else if (x < 0) { mdegree = 90; } } else { //tan(x/y)换算出角度edge float edge = (float) (Math.atan(Math.abs(x / y)) / (Math.PI) * 180); if (x >= 0 && y > 0) { //触摸点在分析图的4位置 mdegree = -edge; } else if (x > 0 && y < 0) { //触摸点在分析图的2位置 mdegree = -180 + edge; } else if (x <= 0 && y < 0) { //触摸点在分析图的1位置 mdegree = 180 - edge; } else if (x < 0 && y > 0) { //触摸点在分析图的3位置 mdegree = edge; } } } //用matrix矩阵旋转图片 public void rotate(float degree) { //设置图片缩放比例,这里是1:1 matrix.setScale(1.0f, 1.0f); //绕图片中心点进行旋转,旋转角度为degree matrix.postRotate(degree, mbitmap.getWidth() / 2, mbitmap.getHeight() / 2); //请求重绘 invalidate(); } }
下面对于Rview类中的mDegree()和rotate()方法,给出一张分析图。
3.在布局文件中,使用Rview。
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.example.liutao.test.Rview xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/mView" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_width="240dp" android:layout_height="240dp" app:src="@drawable/chuyin" /> </RelativeLayout>4.在MainActivity.java中引用布局文件activity_main.xml。
MainActivity.java
package com.example.liutao.test; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
5.chuyin.png图片放到res/drawable目录下。
6.运行APP后就可以触摸图片转动它啦!
相关文章推荐
- 记录我第一次在Android开发图像处理算法的经历
- Android下使用pull解析器生成XML文件、读取XML文件
- 使用ANT打包Android应用
- android学习
- android学习2
- android学习3
- Android 众多的布局属性详解
- android 源码下载
- Android信息处理机制
- Android 点击图片全屏
- Android系统各版本及代号
- android NDk初步学习以及某些小问题的解决方法备忘 二
- Android系统启动过程全解析
- vmbox-android
- Android源代码分析要看这18本书
- Android是如何在不同屏幕上适配图片的 -- 或控件大小
- Android NDK(学习笔记四)—— 在NDK开发中JNI打印Log信息
- android顺序广播
- Android模拟器与局域网通信
- Android入门---下拉刷新上拉加载更多策略的实现