Android ImageView隨手勢(shì)變化動(dòng)態(tài)縮放圖片
在Android實(shí)際項(xiàng)目開發(fā)中,經(jīng)常要用到ImageView這個(gè)組件,如果純粹只是用來顯示某一張圖片,這個(gè)原生的組件是很方便的。但有時(shí)候?yàn)榱诵Ч乓稽c(diǎn),比如很多軟件都有的對(duì)圖片的處理,隨著手勢(shì)的變化來拉大或縮小圖片,這時(shí)就需要對(duì)原生的ImageView做一些處理來達(dá)到我們想要的效果。
原理就是Matrix 和PointF的運(yùn)用,其實(shí)明白后一點(diǎn)都不難。我們需要寫一個(gè)類繼承ImageView來實(shí)現(xiàn)我們想要的功能,我這里演示的是類名是:ScaleImageView ,主要是重寫onTouchEvent方法,去監(jiān)聽手勢(shì)的變化,以此來對(duì)圖片進(jìn)行處理。
不多說了,貼出來原理,復(fù)制過去就可以用了。
<span style="font-size:18px;">import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;
@SuppressLint("FloatMath")
public class ScaleImageView extends ImageView {
private Matrix matrix=new Matrix();
private Matrix savedMatrix=new Matrix();
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
public ScaleImageView(Context context) {
super(context);
}
public ScaleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ScaleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getActionMasked()==MotionEvent.ACTION_POINTER_UP)
Log.d("Infor", "多點(diǎn)操作");
switch(event.getActionMasked()){
case MotionEvent.ACTION_DOWN:
matrix.set(getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(),event.getY());
Log.d("Infor", "觸摸了...");
mode=DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN: //多點(diǎn)觸控
oldDist=this.spacing(event);
if(oldDist>10f){
Log.d("Infor", "oldDist"+oldDist);
savedMatrix.set(matrix);
midPoint(mid,event);
mode=ZOOM;
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
case MotionEvent.ACTION_MOVE:
if(mode==DRAG){ //此實(shí)現(xiàn)圖片的拖動(dòng)功能...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);
}
else if(mode==ZOOM){// 此實(shí)現(xiàn)圖片的縮放功能...
float newDist=spacing(event);
if(newDist>10){
matrix.set(savedMatrix);
float scale=newDist/oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
setImageMatrix(matrix);
return true;
}
}</span>
這個(gè)類寫好之后,用法和原生的ImageView一樣,只是這樣之后可以實(shí)現(xiàn)圖片的縮放,而且不用再做任何處理。用法如下:
這里特別要注意的是 android:scaleType="matrix" 這一行配置,scaleType 一定要是 matrix 類型的,否則就會(huì)失效,凡是要實(shí)現(xiàn)這類效果的,一定要設(shè)置成matrix類型的。
好了,到這里,關(guān)于ImageView對(duì)圖片的動(dòng)態(tài)縮放的實(shí)現(xiàn)就OK了,希望本文所述對(duì)大家的學(xué)習(xí)有做幫助。
- Android手勢(shì)ImageView三部曲 第二部
- Android手勢(shì)ImageView三部曲 第一部
- Android自定義GestureDetector實(shí)現(xiàn)手勢(shì)ImageView
- Android使用ImageView實(shí)現(xiàn)支持手勢(shì)縮放效果
- Android手勢(shì)滑動(dòng)實(shí)現(xiàn)ImageView縮放圖片大小
- Android實(shí)現(xiàn)手勢(shì)控制ImageView圖片大小
- Android通過手勢(shì)實(shí)現(xiàn)的縮放處理實(shí)例代碼
- android開發(fā)之為activity增加左右手勢(shì)識(shí)別示例
- android使用gesturedetector手勢(shì)識(shí)別示例分享
- Android手勢(shì)ImageView三部曲 第三部
相關(guān)文章
完美解決關(guān)于禁止ViewPager預(yù)加載的相關(guān)問題
本篇文章主要介紹了完美解決關(guān)于禁止ViewPager預(yù)加載的相關(guān)問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android Zygote啟動(dòng)構(gòu)造流程及進(jìn)程創(chuàng)建詳解
這篇文章主要為大家介紹了Android Zygote啟動(dòng)構(gòu)造流程及進(jìn)程創(chuàng)建詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Android實(shí)現(xiàn)底部導(dǎo)航欄功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部導(dǎo)航欄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android自定義View實(shí)現(xiàn)加載進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)加載進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android使用setCustomTitle()方法自定義對(duì)話框標(biāo)題
Android有自帶的對(duì)話框標(biāo)題,但是不太美觀,如果要給彈出的對(duì)話框設(shè)置一個(gè)自定義的標(biāo)題,使用AlertDialog.Builder的setCustomTitle()方法非常方便,接下來通過本文給大家介紹Android使用setCustomTitle()方法自定義對(duì)話框標(biāo)題,感興趣的朋友一起學(xué)習(xí)吧2016-02-02
android實(shí)現(xiàn)音樂播放器進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)音樂播放器進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android中自定義Window Title樣式實(shí)例
這篇文章主要介紹了Android中自定義Window Title樣式實(shí)例,本文給出效果預(yù)覽和實(shí)現(xiàn)方法,需要的朋友可以參考下2015-01-01
Android自定義可拖拽的懸浮按鈕DragFloatingActionButton
這篇文章主要介紹了Android自定義可拖拽的懸浮按鈕DragFloatingActionButton,需要的朋友可以參考下2017-06-06

