最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義ImageView實現(xiàn)自動放大縮小動畫

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

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

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

1.配置文件直接添加

當(dāng)直接在布局文件中添加圖片的話,可以在自定義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;
  }
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

  • Android Studio 導(dǎo)入新工程項目圖解

    Android Studio 導(dǎo)入新工程項目圖解

    這篇文章主要介紹了Android Studio 導(dǎo)入新工程項目圖解,需要的朋友可以參考下
    2017-12-12
  • Android動畫之3D翻轉(zhuǎn)效果實現(xiàn)函數(shù)分析

    Android動畫之3D翻轉(zhuǎn)效果實現(xiàn)函數(shù)分析

    Android中的翻轉(zhuǎn)動畫效果的實現(xiàn),Android中并沒有提供直接做3D翻轉(zhuǎn)的動畫,所以關(guān)于3D翻轉(zhuǎn)的動畫效果需要我們自己實現(xiàn),那么我們首先來分析一下Animation 和 Transformation,感興趣的朋友可以了解下啊
    2013-01-01
  • Android自定義封裝banner組件

    Android自定義封裝banner組件

    這篇文章主要為大家詳細介紹了Android自定義封裝banner組件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android的支付密碼輸入框?qū)崿F(xiàn)淺析

    Android的支付密碼輸入框?qū)崿F(xiàn)淺析

    現(xiàn)在有很多的應(yīng)用都有支付密碼功能,而支付密碼的密碼輸入框確實一個很好玩的控件。雖然網(wǎng)上有很多例子,但是抽時間自己設(shè)計一個未嘗不可啊,下面來一起看看吧,有需要的朋友們可以參考學(xué)習(xí)。
    2016-09-09
  • Android二維碼創(chuàng)建實例

    Android二維碼創(chuàng)建實例

    這篇文章主要介紹了Android二維碼創(chuàng)建實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android中SharedPreference詳解及簡單實例

    Android中SharedPreference詳解及簡單實例

    這篇文章主要介紹了 Android中SharedPreference詳解及簡單實例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 房卡麻將分析系列

    房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計詳解及實例

    這篇文章主要介紹了房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Android應(yīng)用開發(fā)中使用Fragment的入門學(xué)習(xí)教程

    Android應(yīng)用開發(fā)中使用Fragment的入門學(xué)習(xí)教程

    這篇文章主要介紹了Android應(yīng)用開發(fā)中Fragment的入門學(xué)習(xí)教程,可以把Fragment看作為Activity基礎(chǔ)之上的模塊,需要的朋友可以參考下
    2016-02-02
  • Android巧用ActionBar實現(xiàn)下拉式導(dǎo)航

    Android巧用ActionBar實現(xiàn)下拉式導(dǎo)航

    這篇文章主要為大家詳細介紹了Android巧用ActionBar實現(xiàn)下拉式導(dǎo)航的相關(guān)資料,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 最新評論

    磐石市| 济阳县| 阿拉尔市| 宝兴县| 苏尼特左旗| 鹿泉市| 伊金霍洛旗| 龙陵县| 蒙山县| 汕头市| 武鸣县| 四平市| 洞口县| 南木林县| 新河县| 定襄县| 寻乌县| 朝阳县| 富源县| 石台县| 昆明市| 通海县| 年辖:市辖区| 石家庄市| 宜川县| 丰城市| 海宁市| 吉安市| 明光市| 定边县| 金山区| 莱芜市| 蒙阴县| 铁力市| 淮北市| 芜湖市| 渭源县| 龙门县| 奈曼旗| 松潘县| 柳河县|