欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫

 更新時(shí)間:2017年06月15日 16:05:14   作者:guangyu_sun  
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這篇講的是如何生成一個(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android開發(fā)中日期工具類DateUtil完整實(shí)例

    Android開發(fā)中日期工具類DateUtil完整實(shí)例

    這篇文章主要介紹了Android開發(fā)中日期工具類DateUtil,結(jié)合完整實(shí)例形式分析了Android針對(duì)日期與時(shí)間的計(jì)算、轉(zhuǎn)換、格式化、獲取等相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Android seekbar(自定義)控制音量同步更新

    Android seekbar(自定義)控制音量同步更新

    這篇文章主要介紹了Android seekbar(自定義)控制音量同步更新的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Android實(shí)現(xiàn)果凍滑動(dòng)效果的控件

    Android實(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-11
  • Kotlin中日志的使用方法詳解

    Kotlin中日志的使用方法詳解

    這篇文章主要給大家介紹了關(guān)于Kotlin中日志的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Android中實(shí)現(xiàn)布局背景模糊化處理的方法

    Android中實(shí)現(xiàn)布局背景模糊化處理的方法

    這篇文章主要介紹了Android中實(shí)現(xiàn)布局背景模糊化處理的方法,需要的朋友可以參考下
    2015-04-04
  • Android RecyclerView設(shè)置下拉刷新的實(shí)現(xiàn)方法

    Android RecyclerView設(shè)置下拉刷新的實(shí)現(xiàn)方法

    這篇文章主要介紹了Android RecyclerView設(shè)置下拉刷新的實(shí)現(xiàn)方法,希望通過(guò)本文通過(guò)SwipeRefreshLayout方式實(shí)現(xiàn)下拉刷新,需要的朋友可以參考下
    2017-10-10
  • Flutter滾動(dòng)組件之ListView使用方法詳解

    Flutter滾動(dòng)組件之ListView使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Flutter滾動(dòng)組件之ListView的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • android如何獲取手機(jī)聯(lián)系人的數(shù)據(jù)庫(kù)示例代碼

    android如何獲取手機(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-01
  • Flutter實(shí)現(xiàn)彈窗攔截器的示例代碼

    Flutter實(shí)現(xiàn)彈窗攔截器的示例代碼

    彈窗的排隊(duì)執(zhí)行在App中是一個(gè)很常見(jiàn)的應(yīng)用場(chǎng)景,這篇文章為大家介紹了兩個(gè)Flutter實(shí)現(xiàn)彈窗攔截器的示例代碼,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-09-09
  • Android學(xué)習(xí)筆記——Menu介紹(一)

    Android學(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

最新評(píng)論