Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫(huà)
這篇講的是如何生成一個(gè)自定義的ImageView,實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫(huà)。
為什么實(shí)現(xiàn)這個(gè)功能呢?因?yàn)槲蚁朐赩iewPager實(shí)現(xiàn)圖片放大縮小的動(dòng)畫(huà),但是ViewPager幾個(gè)頁(yè)面的動(dòng)畫(huà)會(huì)一起動(dòng),而且放大全屏圖片的話(huà)會(huì)相互覆蓋,很詭異。于是上網(wǎng)搜demo,一無(wú)所獲。迫于無(wú)奈。。。
廢話(huà)不多說(shuō),直接貼代碼。
1.配置文件直接添加
當(dāng)直接在布局文件中添加圖片的話(huà),可以在自定義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加載圖片的話(huà),不能直接用getDrawable獲取圖片資源。Glide加載圖片的方式也需要改變。廢話(huà)不多說(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)畫(huà)不夠流暢可以縮小線(xiàn)程等待時(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判斷一個(gè)Activity是否處于棧頂?shù)膶?shí)例
下面小編就為大家分享一篇android判斷一個(gè)Activity是否處于棧頂?shù)膶?shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Android Studio 導(dǎo)入新工程項(xiàng)目圖解
這篇文章主要介紹了Android Studio 導(dǎo)入新工程項(xiàng)目圖解,需要的朋友可以參考下2017-12-12
Android動(dòng)畫(huà)之3D翻轉(zhuǎn)效果實(shí)現(xiàn)函數(shù)分析
Android中的翻轉(zhuǎn)動(dòng)畫(huà)效果的實(shí)現(xiàn),Android中并沒(méi)有提供直接做3D翻轉(zhuǎn)的動(dòng)畫(huà),所以關(guān)于3D翻轉(zhuǎn)的動(dòng)畫(huà)效果需要我們自己實(shí)現(xiàn),那么我們首先來(lái)分析一下Animation 和 Transformation,感興趣的朋友可以了解下啊2013-01-01
Android中SharedPreference詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Android中SharedPreference詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計(jì)詳解及實(shí)例
這篇文章主要介紹了房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計(jì)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android應(yīng)用開(kāi)發(fā)中使用Fragment的入門(mén)學(xué)習(xí)教程
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中Fragment的入門(mén)學(xué)習(xí)教程,可以把Fragment看作為Activity基礎(chǔ)之上的模塊,需要的朋友可以參考下2016-02-02
Android巧用ActionBar實(shí)現(xiàn)下拉式導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android巧用ActionBar實(shí)現(xiàn)下拉式導(dǎo)航的相關(guān)資料,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05

