android控件实现多张图片渐变切换

作者:totcw 时间:2022-06-18 20:11:57 

本来项目是用的viewpager实现的轮播滚动,但是客户觉得轮播的效果太大众化了,于是就要我们改成渐变切换的效果。听到这需求,我最先想到是给viewpager设置切换动画,但是无论怎么设置动画,都要手动切换的时候才有效果。于是我就自定义了一个控件,利用淡入淡出动画实现了这效果,还是先上效果图,没效果图说再多也没用。

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;//当前的页面
 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++) {
       // 设置圆点
       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);

}

}

/**
  * 根据手机的分辨率从 dip 的单位 转成为 px(像素)
  */
 public static int dip2px(Context context, float dpValue) {
   final float scale = context.getResources().getDisplayMetrics().density;
   return (int) (dpValue * scale + 0.5f);
 }

/**
  * 设置图片
  * @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 {
           //当前的淡出,下一张淡入
           ImageView imageView = imageViews.get(size - 1 - i);
           imageView.startAnimation(outAnim.get(size - 1 - i));

}
       } else {
         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 {
           //当前的淡出,下一张淡入
           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);
     }
   });
 }

/**
  * 创建动画
  */
 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);

}
 }

/**
  * 设置点击事件
  */
 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);
 }

/**
  * 设置动画播放和handler延迟时间
  * @param time
  */
 public void setTime(long time) {
   this.time = time;
 }

public void setListner(onClickListner listner) {
   this.listner = listner;
 }

/** 创建一个淡出缩小的动画 */
 public Animation createZoomOutAwayAnim() {
   AnimationSet ret;
   Animation anim;
   ret = new AnimationSet(false);
   // 创建一个淡出的动画
   anim = new AlphaAnimation(1f, 0f);
   anim.setDuration(time);
   anim.setInterpolator(new DecelerateInterpolator());
   ret.addAnimation(anim);
   // 创建一个缩小的动画
   /*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;
 }
 /** 创建一个淡入缩小的动画 */
 public Animation createZoomOutNearAnim() {
   AnimationSet ret;
   Animation anim;
   ret = new AnimationSet(false);
   // 创建一个淡入的动画
   anim = new AlphaAnimation(0f, 1f);
   anim.setDuration(time);
   anim.setInterpolator(new LinearInterpolator());
   ret.addAnimation(anim);
   // 创建一个缩小的动画
   /*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;
 }
}

这个控件的使用非常简单只要在布局文件中使用我们自定义的控件,然后调用setTime设置动画切换的时间,setListener设置图片的点击事件,setImagevies设置图片就可以实现效果.考虑到内存泄漏的问题,只要在ondestry方法里面调用stop方法即可,点击下载Demo

来源:https://blog.csdn.net/totcw/article/details/52161975

标签:android,图片渐变,图片切换
0
投稿

猜你喜欢

  • 详解Java代码常见优化方案

    2023-11-29 03:13:04
  • Java实现批量向mysql写入数据的方法

    2023-11-05 20:51:21
  • 对Java中传值调用的理解分析

    2023-05-03 15:22:14
  • Android界面刷新的方法分享

    2022-06-20 15:20:52
  • Android自定义StepView仿外卖配送进度

    2022-07-30 01:34:35
  • android之BroadcastReceiver应用详解

    2021-08-31 16:05:21
  • spring-boot-maven-plugin引入出现爆红(已解决)

    2021-06-06 12:05:35
  • Android利用BitMap获得图片像素数据的方法

    2023-06-19 15:50:47
  • C#入门教程之集合ArrayList用法详解

    2022-04-30 06:32:13
  • C#实现简单的JSON序列化功能代码实例

    2023-06-21 09:03:52
  • c#使用Socket发送HTTP/HTTPS请求的实现代码

    2023-10-12 07:10:00
  • 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

    2021-08-26 09:31:43
  • 关于Java中增强for循环使用的注意事项

    2021-08-09 16:47:43
  • JavaSE的逻辑控制你了解吗

    2023-01-07 01:32:22
  • Android中EditText和AutoCompleteTextView设置文字选中颜色方法

    2022-12-05 04:45:30
  • Java中间消息件ActiveMQ使用实例

    2021-10-10 14:24:21
  • C#控件闪烁的解决方法

    2023-02-27 07:30:41
  • C#身份证验证小例子

    2022-06-22 05:22:01
  • Android Studio项目适配AndroidX(Android 9.0)的方法步骤

    2022-10-30 12:01:03
  • c#在WebAPI使用Session的方法

    2023-07-07 23:20:10
  • asp之家 软件编程 m.aspxhome.com