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

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

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括西秀網(wǎng)站建設(shè)、西秀網(wǎng)站制作、西秀網(wǎng)頁制作以及西秀網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西秀網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西秀省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

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;
  }

  /**
   * 畫點(diǎn)
   */
  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è)置圓點(diǎn)
        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ù)手機(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;
        //解決點(diǎn)擊事件的沖突
        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è)置點(diǎn)擊事件
   */
  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è)置圖片的點(diǎn)擊事件,setImagevies設(shè)置圖片就可以實(shí)現(xiàn)效果.考慮到內(nèi)存泄漏的問題,只要在ondestry方法里面調(diào)用stop方法即可,點(diǎn)擊下載Demo

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

當(dāng)前題目:android控件實(shí)現(xiàn)多張圖片漸變切換
地址分享:http://bm7419.com/article28/gippjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、網(wǎng)站設(shè)計公司云服務(wù)器、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司