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

首頁 > 系統(tǒng) > Android > 正文

android控件實現(xiàn)多張圖片漸變切換

2019-10-21 21:39:38
字體:
供稿:網(wǎng)友

本來項目是用的viewpager實現(xiàn)的輪播滾動,但是客戶覺得輪播的效果太大眾化了,于是就要我們改成漸變切換的效果。聽到這需求,我最先想到是給viewpager設(shè)置切換動畫,但是無論怎么設(shè)置動畫,都要手動切換的時候才有效果。于是我就自定義了一個控件,利用淡入淡出動畫實現(xiàn)了這效果,還是先上效果圖,沒效果圖說再多也沒用。

android控件,多張圖片,漸變切換

public class Gradient extends RelativeLayout {  private List<ImageView> imageViews;  private List<Animation> outAnim;//淡出動畫  private List<Animation> inAnim;//淡入動畫  private Context mContext;  private Handler handler = new Handler(Looper.getMainLooper());  private int couot;  private int currentIndex;//當(dāng)前的頁面  private LinearLayout linearLayout;  private onClickListner listner;  private long time=3000;//動畫間隔時間  public Gradient(Context context) {    this(context, null);  }  public Gradient(Context context, AttributeSet attrs) {    super(context, attrs);    this.mContext = context;  }  /**   * 畫點   */  public void cratePoint() {    if (null != imageViews && imageViews.size() > 0) {      int size = imageViews.size();      linearLayout = new LinearLayout(mContext);      linearLayout.setOrientation(LinearLayout.HORIZONTAL);      linearLayout.setGravity(Gravity.CENTER);      // 添加圖片      for (int i = 0; i < size; i++) {        // 設(shè)置圓點        View viewPoint = new View(mContext);        viewPoint.setBackgroundResource(R.drawable.point_background);        int weight = dip2px(mContext, 5);        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(weight, weight);        lp.leftMargin = weight;        viewPoint.setLayoutParams(lp);        viewPoint.setEnabled(false);        linearLayout.addView(viewPoint);      }      View childAt = linearLayout.getChildAt(0);      if (null != childAt) {        childAt.setEnabled(true);      }      //添加到圖片的下邊      RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(-1,-2);      rlp.bottomMargin = dip2px(mContext, 5);      rlp.addRule(ALIGN_PARENT_BOTTOM);      this.addView(linearLayout, rlp);    }  }  /**   * 根據(jù)手機的分辨率從 dip 的單位 轉(zhuǎn)成為 px(像素)   */  public static int dip2px(Context context, float dpValue) {    final float scale = context.getResources().getDisplayMetrics().density;    return (int) (dpValue * scale + 0.5f);  }  /**   * 設(shè)置圖片   * @param imageViews   */  public void setImageViews(List<ImageView> imageViews) {    this.imageViews = imageViews;    for (int i = 0; i < imageViews.size(); i++) {      RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(-1,-1);      addView(imageViews.get(i),layoutParams);    }    setonClick();    cratePoint();    createAnim();    start();  }  /**   * 開啟動畫   */  private void start() {    final int size = imageViews.size();    handler.post(new Runnable() {      @Override      public void run() {        final int i = couot % size;        //解決點擊事件的沖突        for (int j = 0; j < size; j++) {          if (j == i) {            imageViews.get(i).setClickable(true);          } else {            imageViews.get(i).setClickable(false);          }        }        if (couot < size) {          if (i == size - 1) {            ImageView imageView = imageViews.get(0);            imageView.startAnimation(outAnim.get(0));            ImageView imageView2 = imageViews.get(size - 1);            imageView2.startAnimation(inAnim.get(size - 1));          } else {            //當(dāng)前的淡出,下一張淡入            ImageView imageView = imageViews.get(size - 1 - i);            imageView.startAnimation(outAnim.get(size - 1 - i));          }        } else {          if (i == size - 1) {            //當(dāng)顯示到最后一張的時候,要跳到第一張            ImageView imageView = imageViews.get(0);            imageView.startAnimation(outAnim.get(0));            ImageView imageView2 = imageViews.get(size - 1);            imageView2.startAnimation(inAnim.get(size - 1));          } else {            //當(dāng)前的淡出,下一張淡入            ImageView imageView = imageViews.get(size - 1 - i);            imageView.startAnimation(outAnim.get(size - 1 - i));            ImageView imageView2 = imageViews.get(size - 2 - i);            imageView2.startAnimation(inAnim.get(size - 2 - i));          }        }        currentIndex = i;        linearLayout.getChildAt(currentIndex % size).setEnabled(false);        currentIndex++;        linearLayout.getChildAt(currentIndex % size).setEnabled(true);        couot++;        handler.postDelayed(this, time);      }    });  }  /**   * 創(chuàng)建動畫   */  private void createAnim() {    outAnim = new ArrayList<>();    inAnim = new ArrayList<>();    for (int i = 0; i < imageViews.size(); i++) {      Animation zoomOutAwayAnim = createZoomOutAwayAnim();      zoomOutAwayAnim.setFillAfter(true);      outAnim.add(zoomOutAwayAnim);      Animation zoomOutNearAnim = createZoomOutNearAnim();      zoomOutNearAnim.setFillAfter(true);      inAnim.add(zoomOutNearAnim);    }  }  /**   * 設(shè)置點擊事件   */  public void setonClick() {    for (int i = 0; i < imageViews.size(); i++) {      imageViews.get(i).setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {          if (listner != null) {            listner.setonClick((currentIndex) % imageViews.size());          }        }      });    }  }  public interface onClickListner{    void setonClick(int position);  }  /**   * 設(shè)置動畫播放和handler延遲時間   * @param time   */  public void setTime(long time) {    this.time = time;  }  public void setListner(onClickListner listner) {    this.listner = listner;  }  /** 創(chuàng)建一個淡出縮小的動畫 */  public Animation createZoomOutAwayAnim() {    AnimationSet ret;    Animation anim;    ret = new AnimationSet(false);    // 創(chuàng)建一個淡出的動畫    anim = new AlphaAnimation(1f, 0f);    anim.setDuration(time);    anim.setInterpolator(new DecelerateInterpolator());    ret.addAnimation(anim);    // 創(chuàng)建一個縮小的動畫    /*anim = new ScaleAnimation(1, 0, 1, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);    anim.setDuration(MEDIUM);    anim.setInterpolator(new DecelerateInterpolator());    ret.addAnimation(anim);*/    return ret;  }  /** 創(chuàng)建一個淡入縮小的動畫 */  public Animation createZoomOutNearAnim() {    AnimationSet ret;    Animation anim;    ret = new AnimationSet(false);    // 創(chuàng)建一個淡入的動畫    anim = new AlphaAnimation(0f, 1f);    anim.setDuration(time);    anim.setInterpolator(new LinearInterpolator());    ret.addAnimation(anim);    // 創(chuàng)建一個縮小的動畫    /*anim = new ScaleAnimation(3, 1, 3, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);    anim.setDuration(MEDIUM);    anim.setInterpolator(new DecelerateInterpolator());    ret.addAnimation(anim);*/    return ret;  }}

這個控件的使用非常簡單只要在布局文件中使用我們自定義的控件,然后調(diào)用setTime設(shè)置動畫切換的時間,setListener設(shè)置圖片的點擊事件,setImagevies設(shè)置圖片就可以實現(xiàn)效果.考慮到內(nèi)存泄漏的問題,只要在ondestry方法里面調(diào)用stop方法即可,點擊下載Demo

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


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蒙阴县| 班玛县| 延寿县| 宿迁市| 海门市| 开远市| 昭觉县| 海晏县| 南郑县| 合肥市| 定兴县| 南华县| 徐汇区| 九龙坡区| 石楼县| 满城县| 邢台县| 法库县| 鸡西市| 永年县| 姜堰市| 本溪市| 贞丰县| 长沙市| 泰兴市| 绿春县| 兰考县| 大英县| 遂平县| 龙游县| 石渠县| 荆门市| 波密县| 洛宁县| 闵行区| 博乐市| 九江市| 白河县| 长沙县| 富源县| 林口县|