
代码:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="雨松MOMO"
android:background="#FF0000"
android:textColor="#000000"
android:textSize="18dip"
/>
</FrameLayout>
关于ImageView的手势缩放,有很多种方法,绝大多数开源自定义缩放都是修改了ondraw函数来实现的。但是ImageView本身有scaleType属性,通过设置android:scaleType="matrix" 可以用很少的代码就实现缩放功能。缩放的优点是实现起来简单,同时因为没有反复调用ondraw函数,缩放过程中不会有闪烁现象。MATRIX矩阵可以动态缩小放大图片来显示,缩小图片:
代码如下 复制代码
//获得Bitmap的高和宽
int bmpWidth=bmp.getWidth()
int bmpHeight=bmp.getHeight()
//设置缩小比例
double scale=0.8
//计算出这次要缩小的比例
scaleWidth=(float)(scaleWidth*scale)
scaleHeight=(float)(scaleHeight*scale)
//产生resize后的Bitmap对象
Matrix matrix=new Matrix()
matrix.postScale(scaleWidth, scaleHeight)
Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true)
下面将一个自定义的实现了手势缩放的ImageView代码拷贝如下:
代码如下 复制代码
package com.jcodecraeer.stargallerry
import android.content.Context
import android.graphics.Matrix
import android.graphics.PointF
import android.util.AttributeSet
import android.util.FloatMath
import android.view.MotionEvent
import android.widget.ImageView
public class ImageTouchView extends ImageView {
private PointF startPoint = new PointF()
private Matrix matrix = new Matrix()
private Matrix currentMaritx = new Matrix()
private int mode = 0//用于标记模式
private static final int DRAG = 1//拖动
private static final int ZOOM = 2//放大
private float startDis = 0
private PointF midPoint//中心点
/**
* 默认构造函数
* @param context
*/
public ImageTouchView(Context context){
super(context)
}
/**
* 该构造方法在静态引入XML文件中是必须的
* @param context
* @param paramAttributeSet
*/
public ImageTouchView(Context context,AttributeSet paramAttributeSet){
super(context,paramAttributeSet)
}
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() &MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mode = DRAG
currentMaritx.set(this.getImageMatrix())//记录ImageView当期的移动位置
startPoint.set(event.getX(),event.getY())//开始点
break
case MotionEvent.ACTION_MOVE://移动事件
if (mode == DRAG) {//图片拖动事件
float dx = event.getX() - startPoint.x//x轴移动距离
float dy = event.getY() - startPoint.y
matrix.set(currentMaritx)//在当前的位置基础上移动
matrix.postTranslate(dx, dy)
} else if(mode == ZOOM){//图片放大事件
float endDis = distance(event)//结束距离
if(endDis >10f){
float scale = endDis / startDis//放大倍数
//Log.v("scale=", String.valueOf(scale))
matrix.set(currentMaritx)
matrix.postScale(scale, scale, midPoint.x, midPoint.y)
}
}
break
case MotionEvent.ACTION_UP:
mode = 0
break
//有手指离开屏幕,但屏幕还有触点(手指)
case MotionEvent.ACTION_POINTER_UP:
mode = 0
break
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)