Android自定義ImageView實現(xiàn)自動放大縮小動畫
這篇講的是如何生成一個自定義的ImageView,實現(xiàn)自動放大縮小動畫。
為什么實現(xiàn)這個功能呢?因為我想在ViewPager實現(xiàn)圖片放大縮小的動畫,但是ViewPager幾個頁面的動畫會一起動,而且放大全屏圖片的話會相互覆蓋,很詭異。于是上網(wǎng)搜demo,一無所獲。迫于無奈。。。
廢話不多說,直接貼代碼。
1.配置文件直接添加
當(dāng)直接在布局文件中添加圖片的話,可以在自定義View代碼中用getDrawable()獲取圖片資源,然后通過DrawBitmap繪制圖片。通過不斷繪制圖片的位置,達(dá)到放大縮小的功能。
第一種情況實在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 .通過Glide加載圖片的方式
通過Glide加載圖片的話,不能直接用getDrawable獲取圖片資源。Glide加載圖片的方式也需要改變。廢話不多說,直接上代碼。
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; } }
如果感覺動畫不夠流暢可以縮小線程等待時間。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義圓角ImageView控件
- Android 自定義imageview實現(xiàn)圖片縮放實例詳解
- Android自定義控件之圓形、圓角ImageView
- Android自定義GestureDetector實現(xiàn)手勢ImageView
- android自定義ImageView仿圖片上傳示例
- Android自定義ImageView實現(xiàn)在圖片上添加圖層效果
- Android通過自定義ImageView控件實現(xiàn)圖片的縮放和拖動的實現(xiàn)代碼
- Android 自定義圓形頭像CircleImageView支持加載網(wǎng)絡(luò)圖片的實現(xiàn)代碼
- Android自定義圓角ImageView
- Android布局自定義Shap圓形ImageView可以單獨設(shè)置背景與圖片
- Android編程實現(xiàn)自定義ImageView圓圖功能的方法
相關(guān)文章
Android開發(fā)中日期工具類DateUtil完整實例
這篇文章主要介紹了Android開發(fā)中日期工具類DateUtil,結(jié)合完整實例形式分析了Android針對日期與時間的計算、轉(zhuǎn)換、格式化、獲取等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android RecyclerView設(shè)置下拉刷新的實現(xiàn)方法
這篇文章主要介紹了Android RecyclerView設(shè)置下拉刷新的實現(xiàn)方法,希望通過本文通過SwipeRefreshLayout方式實現(xiàn)下拉刷新,需要的朋友可以參考下2017-10-10android如何獲取手機聯(lián)系人的數(shù)據(jù)庫示例代碼
很多人在做手機聯(lián)系人的apk時會遇到,如何獲取手機聯(lián)系人數(shù)據(jù)庫的問題,本篇文章主要介紹了android如何獲取手機聯(lián)系人的數(shù)據(jù)庫示例代碼,有興趣的可以了解一下。2017-01-01Android學(xué)習(xí)筆記——Menu介紹(一)
Android3.0(API level 11)開始,Android設(shè)備不再需要專門的菜單鍵。隨著這種變化,Android app應(yīng)該取消對傳統(tǒng)6項菜單的依賴。取而代之的是提供anction bar來提供基本的用戶功能2014-10-10