国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義ImageView實現自動放大縮小動畫

2019-12-12 02:40:12
字體:
來源:轉載
供稿:網友

這篇講的是如何生成一個自定義的ImageView,實現自動放大縮小動畫。

為什么實現這個功能呢?因為我想在ViewPager實現圖片放大縮小的動畫,但是ViewPager幾個頁面的動畫會一起動,而且放大全屏圖片的話會相互覆蓋,很詭異。于是上網搜demo,一無所獲。迫于無奈。。。
廢話不多說,直接貼代碼。

1.配置文件直接添加

當直接在布局文件中添加圖片的話,可以在自定義View代碼中用getDrawable()獲取圖片資源,然后通過DrawBitmap繪制圖片。通過不斷繪制圖片的位置,達到放大縮小的功能。
第一種情況實在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;  }}

如果感覺動畫不夠流暢可以縮小線程等待時間。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安徽省| 汝城县| 梨树县| 林甸县| 周宁县| 黑龙江省| 双流县| 田林县| 隆子县| 济阳县| 盈江县| 康定县| 思南县| 南岸区| 连平县| 泗洪县| 鄯善县| 湖北省| 静宁县| 日照市| 大宁县| 桃园县| 玉山县| 南澳县| 类乌齐县| 三都| 西藏| 金堂县| 突泉县| 阿坝县| 灵台县| 刚察县| 自贡市| 广丰县| 马鞍山市| 康马县| 深州市| 高清| 黔江区| 嘉黎县| 绥芬河市|