Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫
這篇講的是如何生成一個(gè)自定義的ImageView,實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫。
為什么實(shí)現(xiàn)這個(gè)功能呢?因?yàn)槲蚁朐赩iewPager實(shí)現(xiàn)圖片放大縮小的動(dòng)畫,但是ViewPager幾個(gè)頁(yè)面的動(dòng)畫會(huì)一起動(dòng),而且放大全屏圖片的話會(huì)相互覆蓋,很詭異。于是上網(wǎng)搜demo,一無(wú)所獲。迫于無(wú)奈。。。
廢話不多說(shuō),直接貼代碼。
1.配置文件直接添加
當(dāng)直接在布局文件中添加圖片的話,可以在自定義View代碼中用getDrawable()獲取圖片資源,然后通過(guò)DrawBitmap繪制圖片。通過(guò)不斷繪制圖片的位置,達(dá)到放大縮小的功能。
第一種情況實(shí)在XML布局文件中直接添加的:
public class CoolImageView extends ImageView { private int mLeft = 0; private int mTop = 0; private Handler mHandler; private Bitmap bitmap; private Rect srcRect = new Rect(); private Rect dstRect = new Rect(); private int imgWidth; private int imgHeight; private boolean flag; private boolean istart; public CoolImageView(Context context) { super(context); } public CoolImageView(Context context, AttributeSet attrs) { super(context, attrs); setUp(context, attrs); } public CoolImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setUp(context, attrs); } private void setUp(Context context, AttributeSet attrs) { mHandler = new MoveHandler(); mHandler.sendEmptyMessageDelayed(1, 220L); istart = true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight(); //獲取圖片資源 BitmapDrawable drawable = (BitmapDrawable) getDrawable(); bitmap = drawable.getBitmap(); dstRect.left = 0; dstRect.top = 0; dstRect.right = width; dstRect.bottom = height; if (bitmap != null) { if (istart) { // 獲取圖片的寬高 imgWidth = bitmap.getWidth(); imgHeight = bitmap.getHeight(); srcRect.left = 0 + mLeft; srcRect.right = imgWidth - mLeft; srcRect.top = 0 + mTop; srcRect.bottom = imgHeight - mTop; canvas.drawBitmap(bitmap, srcRect, dstRect, null); } else { canvas.drawBitmap(bitmap, null, dstRect, null); } } } private class MoveHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: if (imgHeight != 0) { if (mTop == 0) { mTop += 5; mLeft += 5; } else if (mTop == 120) { mTop -= 5; mLeft -= 5; } } postInvalidate(); mHandler.sendEmptyMessageDelayed(1, 250); break; } } } public void start() { mTop = 0; mLeft = 0; istart = true; mHandler.sendEmptyMessageDelayed(1, 220L); } public void stop() { istart = false; } }
2 .通過(guò)Glide加載圖片的方式
通過(guò)Glide加載圖片的話,不能直接用getDrawable獲取圖片資源。Glide加載圖片的方式也需要改變。廢話不多說(shuō),直接上代碼。
CoolimageView直接從Glide的緩存中加載圖片。
Glide.with(GoodsPagerActivity.this) .load(sList.get(position).img) .override(width, height) .centerCrop() .into(new SimpleTarget<GlideDrawable>() { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { imageView.setImageDrawable(resource); } });
CoolImageView.java:
唯一不同的是獲取圖片的方式;
```java
public class CoolImageView extends ImageView { private int mLeft = 0; private int mTop = 0; private Handler mHandler; private Bitmap bitmap; private Rect srcRect = new Rect(); private Rect dstRect = new Rect(); private int imgWidth; private int imgHeight; private boolean flag; private boolean istart; private int width; private int height; public CoolImageView(Context context) { super(context); } public CoolImageView(Context context, AttributeSet attrs) { super(context, attrs); setUp(context, attrs); } public CoolImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setUp(context, attrs); } private void setUp(Context context, AttributeSet attrs) { mHandler = new MoveHandler(); mHandler.sendEmptyMessageDelayed(1, 220L); istart = true; } @Override public void setImageDrawable(@Nullable Drawable drawable) { super.setImageDrawable(drawable); if (mHandler != null) { mHandler.sendEmptyMessageDelayed(1, 220L); } else { mHandler = new MoveHandler(); mHandler.sendEmptyMessageDelayed(1, 220L); istart = true; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); width = getWidth(); height = getHeight(); GlideBitmapDrawable drawable = (GlideBitmapDrawable) getDrawable(); if (drawable != null) { bitmap = drawable.getBitmap(); } dstRect.left = 0; dstRect.top = 0; dstRect.right = width; dstRect.bottom = height; if (bitmap != null) { if (istart) { imgWidth = bitmap.getWidth(); imgHeight = bitmap.getHeight(); srcRect.left = 0 + mLeft; srcRect.right = imgWidth - mLeft; srcRect.top = 0 + mTop; srcRect.bottom = imgHeight - mTop; canvas.drawBitmap(bitmap, srcRect, dstRect, null); } else { canvas.drawBitmap(bitmap, null, dstRect, null); } } } private class MoveHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: if (imgHeight != 0) { if (mTop == 0) { flag = true; } else if (mTop == 60) { flag = false; } if (!flag) { mTop -= 2; mLeft -= 1; } else { mTop += 2; mLeft += 1; } } postInvalidate(); mHandler.sendEmptyMessageDelayed(1, 200); break; } } } public void start() { mTop = 0; mLeft = 0; istart = true; mHandler.sendEmptyMessageDelayed(1, 220L); } public void stop() { istart = false; } }
如果感覺(jué)動(dòng)畫不夠流暢可以縮小線程等待時(shí)間。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義圓角ImageView控件
- Android 自定義imageview實(shí)現(xiàn)圖片縮放實(shí)例詳解
- Android自定義控件之圓形、圓角ImageView
- Android自定義GestureDetector實(shí)現(xiàn)手勢(shì)ImageView
- android自定義ImageView仿圖片上傳示例
- Android自定義ImageView實(shí)現(xiàn)在圖片上添加圖層效果
- Android通過(guò)自定義ImageView控件實(shí)現(xiàn)圖片的縮放和拖動(dòng)的實(shí)現(xiàn)代碼
- Android 自定義圓形頭像CircleImageView支持加載網(wǎng)絡(luò)圖片的實(shí)現(xiàn)代碼
- Android自定義圓角ImageView
- Android布局自定義Shap圓形ImageView可以單獨(dú)設(shè)置背景與圖片
- Android編程實(shí)現(xiàn)自定義ImageView圓圖功能的方法
相關(guān)文章
Android開發(fā)中日期工具類DateUtil完整實(shí)例
這篇文章主要介紹了Android開發(fā)中日期工具類DateUtil,結(jié)合完整實(shí)例形式分析了Android針對(duì)日期與時(shí)間的計(jì)算、轉(zhuǎn)換、格式化、獲取等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android實(shí)現(xiàn)果凍滑動(dòng)效果的控件
這篇文章給大家主要介紹了利用Android如何實(shí)現(xiàn)果凍效果滑動(dòng)效果的控件,實(shí)現(xiàn)的效果類似于iOS有阻尼效果的滑動(dòng)控件,一般我們比較親切地稱之為果凍控件,常見(jiàn)的如微信里[我]的那個(gè)面板模塊,即使沒(méi)有再多的選項(xiàng),也不會(huì)很生硬的不允許用戶滑動(dòng)。下面來(lái)一起看看吧。2016-11-11Android中實(shí)現(xiàn)布局背景模糊化處理的方法
這篇文章主要介紹了Android中實(shí)現(xiàn)布局背景模糊化處理的方法,需要的朋友可以參考下2015-04-04Android RecyclerView設(shè)置下拉刷新的實(shí)現(xiàn)方法
這篇文章主要介紹了Android RecyclerView設(shè)置下拉刷新的實(shí)現(xiàn)方法,希望通過(guò)本文通過(guò)SwipeRefreshLayout方式實(shí)現(xiàn)下拉刷新,需要的朋友可以參考下2017-10-10Flutter滾動(dòng)組件之ListView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Flutter滾動(dòng)組件之ListView的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03android如何獲取手機(jī)聯(lián)系人的數(shù)據(jù)庫(kù)示例代碼
很多人在做手機(jī)聯(lián)系人的apk時(shí)會(huì)遇到,如何獲取手機(jī)聯(lián)系人數(shù)據(jù)庫(kù)的問(wèn)題,本篇文章主要介紹了android如何獲取手機(jī)聯(lián)系人的數(shù)據(jù)庫(kù)示例代碼,有興趣的可以了解一下。2017-01-01Flutter實(shí)現(xiàn)彈窗攔截器的示例代碼
彈窗的排隊(duì)執(zhí)行在App中是一個(gè)很常見(jiàn)的應(yīng)用場(chǎng)景,這篇文章為大家介紹了兩個(gè)Flutter實(shí)現(xiàn)彈窗攔截器的示例代碼,感興趣的小伙伴可以學(xué)習(xí)一下2023-09-09Android學(xué)習(xí)筆記——Menu介紹(一)
Android3.0(API level 11)開始,Android設(shè)備不再需要專門的菜單鍵。隨著這種變化,Android app應(yīng)該取消對(duì)傳統(tǒng)6項(xiàng)菜單的依賴。取而代之的是提供anction bar來(lái)提供基本的用戶功能2014-10-10