android:scaletype="matrix",android多点触碰及android:scaletype的讲解

首先是android:scaletype 通俗地讲 控制ImageView中的图片与ImageView

该控件的大小匹配方式

有8中做个简单的讲解可以实验

matrix 这个是比较重要的设置了该属性之后ImageView控件就可以在代码中通过Matrix进行缩小放大控制图片了

fitXY 控件中的图片不按照比例放大或缩小到控件的大小

fitStart 控件中的图片按照控件的宽度放大或缩小到控件的大小 并且显示在控件中的上方

fitcenter 控件中的图片按照控件的宽度放大或缩小到控件的大小 并且显示在控件中的中间

fitEnd 控件中的图片按照控件的宽度放大或缩小到控件的大小 并且显示在控件中的下方

center 控件中的图片不做任何缩放 并且居中显示

centerinside 控件中的图片小于控件大小时 不做变化居中显示 若大于

缩小至控件大小并居中显示

centercrop 控件图片大小 一定大于等于 控件大小 且居中显示

在这里要实现多点触碰缩小放大图片 首先设置android:scaleType="matrix"

为ImageView控件绑定OnTouchListener监听器

在回调方法OnTouch中处理事件

ACTION_DOWN 手指按下ACTION_MOVE手指移动 ACTION_UP手指离开

ACTION_POINTER_DOWN多只手指按下 ACTION_POINTER_UP一只手指离开了

下面是拖动和缩放图片的源码

package com.example.testdragscale;

import android.os.Bundle;

import android.app.Activity;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.util.FloatMath;

import android.view.Menu;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

public class MainActivity extends Activity {

private ImageView mImage;

@Override

protected

void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mImage = (ImageView) this.findViewById(R.id.imageview);

mImage.setOnTouchListener(new TouchListener());

}

private

final class TouchListener implements OnTouchListener {

private PointF startPoint = new PointF();

private float dx;

private float dy;

Matrix matrix = new Matrix();

Matrix currentMatrix = new Matrix();

private int mode;

private static final int DRAG = 1;

private static final int SCALE = 2;

private PointF midPoint;

float endDis,startDis;

@Override

public boolean onTouch(View v,

MotionEvent event) {

switch

(event.getAction()&MotionEvent.ACTION_MASK) {

case

MotionEvent.ACTION_DOWN:

mode

= DRAG;

currentMatrix.set(mImage.getImageMatrix());

startPoint.set(event.getX(),event.getY());

break;

case

MotionEvent.ACTION_MOVE:

if(mode

== DRAG) {

dx

= event.getX()-startPoint.x;

dy

= event.getY()-startPoint.y;

matrix.set(currentMatrix);

matrix.postTranslate(dx,

dy);

}

else if(mode == SCALE) {

endDis

= getDistance(event);

float

sca = endDis/startDis;

matrix.set(currentMatrix);

matrix.postScale(sca,sca,midPoint.x,midPoint.y);

}

break;

case

MotionEvent.ACTION_POINTER_DOWN:

mode

= SCALE;

startDis

= getDistance(event);

midPoint

= getMidPoint(event);

currentMatrix.set(mImage.getImageMatrix());

break;

case

MotionEvent.ACTION_POINTER_UP:

mode

= 0;

break;

default:

break;

}

mImage.setImageMatrix(matrix);

return

true;

}

private float

getDistance(MotionEvent event) {

float dx =

event.getX(1) - event.getX(0);

float dy =

event.getY(1) - event.getY(0);

return

FloatMath.sqrt(dx*dx + dy*dy);

}

private PointF

getMidPoint(MotionEvent event) {

float midx =

(event.getX(1)+event.getX(0))/2;

float midy =

(event.getY(1)+event.getY(0))/2;

return new

PointF(midx, midy);

}

}

@Override

public

boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值