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)文章
Android實(shí)現(xiàn)動(dòng)態(tài)圓環(huán)的圖片頭像控件
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶有動(dòng)態(tài)圓環(huán)的圓形圖片控件DynamicAvatarView的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android 下載并打開PDF,Doc,Dwg文檔實(shí)例
本篇文章主要介紹了Android 下載并打開PDF,Doc,Dwg文檔實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04Android直播系統(tǒng)平臺(tái)搭建之圖片實(shí)現(xiàn)陰影效果的方法小結(jié)
這篇文章主要介紹了Android直播系統(tǒng)平臺(tái)搭建, 圖片實(shí)現(xiàn)陰影效果的若干種方法,本文給大家?guī)砣N方法,每種方法通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08Android中使用的定時(shí)針(刷新頁面請(qǐng)求服務(wù)器)詳解
這篇文章主要介紹了Android中使用的定時(shí)針(刷新頁面請(qǐng)求服務(wù)器)詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12Android開發(fā)TextvView實(shí)現(xiàn)鏤空字體效果示例代碼
這篇文章主要介紹了Android開發(fā)TextvView實(shí)現(xiàn)鏤空字體效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Android中使用ScrollView指定view的頂部懸停效果
在項(xiàng)目開發(fā)中遇到這樣的需求,需要實(shí)現(xiàn)scrollview頂部的懸停效果,實(shí)現(xiàn)原理非常簡單,下面小編通過本文給大家分享實(shí)例代碼,需要的朋友參考下2017-04-04Android開發(fā)中Intent.Action各種常見的作用匯總
今天小編就為大家分享一篇關(guān)于Android開發(fā)中Intent.Action各種常見的作用匯總,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫的方法
這篇文章主要介紹了Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12