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;
}
}
}