ImageView實(shí)現(xiàn)單指拖動(dòng)雙指縮放

package com.xiao.pandapointerpicture;

import android.content.Context;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.widget.ImageView;

/**

* Created by StarMushroom on 2017/4/26.

*/

public class MyImageView extends ImageView {

private float scale = 0.05f;

// 兩點(diǎn)觸屏后之間的長度

private float beforeLenght;

private float afterLenght;

// 單點(diǎn)移動(dòng)的前后坐標(biāo)值

private float afterX, afterY;

private float beforeX, beforeY;

public MyImageView(Context context) {

super(context);

}

public MyImageView(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

}

/**

* 讓圖片跟隨手指觸屏的位置移動(dòng) beforeX、Y是用來保存前一位置的坐標(biāo) afterX、Y是用來保存當(dāng)前位置的坐標(biāo)

* 它們的差值就是ImageView各坐標(biāo)的增加或減少值

*

* @param event

*/

public void moveWithFinger(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

beforeX = event.getX();

beforeY = event.getY();

break;

case MotionEvent.ACTION_MOVE:

afterX = event.getX();

afterY = event.getY();

this.setLocation((int) (afterX - beforeX), (int) (afterY - beforeY));

beforeX = afterX;

beforeY = afterY;

break;

case MotionEvent.ACTION_UP:

break;

}

}

/**

* 用來設(shè)置ImageView的位置,移動(dòng)Imageview

*

* @param x

* @param y

*/

public void setLocation(int x, int y) {

//TODO 底部還是會(huì)滑出去? 左上右正常

//獲取設(shè)備的寬高

int widthPixels = getContext().getResources().getDisplayMetrics().widthPixels;

int heightPixels = getContext().getResources().getDisplayMetrics().heightPixels;

if (getLeft() + x > 5

&& getTop() + y > 5

&& getRight() + x < widthPixels - 5

&& getBottom() + y < heightPixels-5) {

this.setFrame(getLeft() + x, getTop() + y, getRight() + x, getBottom() + y);

}

}

/**

* 通過多點(diǎn)觸屏放大或縮小圖像 beforeLenght用來保存前一時(shí)間兩點(diǎn)之間的距離 afterLenght用來保存當(dāng)前時(shí)間兩點(diǎn)之間的距離

*

* @param event

*/

public void scaleWithFinger(MotionEvent event) {

float moveX = event.getX(1) - event.getX(0);

float moveY = event.getY(1) - event.getY(0);

//多點(diǎn)觸摸判斷

switch (event.getActionMasked()) {

case MotionEvent.ACTION_POINTER_DOWN: //多點(diǎn)按下匹配

beforeLenght = (float) Math.sqrt((moveX * moveX) + (moveY * moveY));

break;

case MotionEvent.ACTION_MOVE: //移動(dòng)沒有多點(diǎn)觸摸的區(qū)分

// 得到兩個(gè)點(diǎn)之間的長度

afterLenght = (float) Math.sqrt((moveX * moveX) + (moveY * moveY));

float gapLenght = afterLenght - beforeLenght;

// 如果當(dāng)前時(shí)間兩點(diǎn)距離大于前一時(shí)間兩點(diǎn)距離,則傳0,否則傳1

if (gapLenght > 0) {

this.setScale(scale, 0);

} else if (gapLenght < 0) {

this.setScale(scale, 1);

} else if (gapLenght == 0) {

break;

}

beforeLenght = afterLenght;

break;

}

}

/**

* 用來放大縮小ImageView.

*

* @param scaleSize

* @param flag? ? ? 0是放大圖片,為1是縮小圖片

*/

private void setScale(float scaleSize, int flag) {

int scale_x = (int) (scaleSize * getWidth());

int scale_y = (int) (scaleSize * getHeight());

switch (flag) {

case 0:

if (getWidth() < getContext().getResources().getDisplayMetrics().widthPixels * 3) {

this.setFrame(

getLeft() - scale_x,

getTop() - scale_y,

getRight() + scale_x,

getBottom() + scale_y);

}

break;

case 1:

if (getWidth() > 50 + scale_x * 2) {

this.setFrame(

getLeft() + scale_x,

getTop() + scale_y,

getRight() - scale_x,

getBottom() - scale_y);

}

break;

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容