Android realizes automatic carousel effect

  • 2021-10-24 23:43:59
  • OfStack

In this paper, we share the specific code of Android to realize the effect display of carousel for your reference. The specific contents are as follows

MainActivity.java


public class MainActivity extends AppCompatActivity {

 private LinearLayout ll_dots;
 private TextView viewpager_tv;

 // 将ViewPager定义为全局变量,方便使用.
 private ViewPager viewpager_vp;

 // 建立1个ArrayList集合.泛型指定为ImageView.
 ArrayList<ImageView> imageViews = new ArrayList<ImageView>();



 //创建1个handler对象,复写handlerMessage方法,用switch方法,通过msg.what得到标识.333
 private Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   switch (msg.what) {
    case 1:
     //得到当前VIewPager和用户交互的item条目.VIewPager对象.getCurrentItem 333
     int currentItem = viewpager_vp.getCurrentItem();
     //设置ViewPager当前显示的界面,得到的ITem+1
     viewpager_vp.setCurrentItem(currentItem + 1);
     //通过静态方法sendEmptyMessageDelayed,延时重复执行命令.注意不是sendEmptyMessageAtTime 333
     sendEmptyMessageDelayed(1, 3000);
     break;
    default:
     break;
   }

  }
 };

 //图片int数组资源
 private int[] imageResIds = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, R.drawable.f};

 //图片字符串数组String[]资源.
 private String[] descs = {
   "网页设计师联盟",
   "教程网",
   "PS联盟",
   "25学堂",
   "课工场带你逆袭,助你走向人生巅峰",
   "当你因需求被项目经理频繁修改,而想之暴打时,请先看易老师贱笑图,你是不是更想打我了"
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //对控件进行初始化
  init();
 }

 /**
  * 对VIewPager进行初始化.
  */
 private void init() {
  //找到可以设置点的容器LinearLayout的对象,进行点的添加
  ll_dots = (LinearLayout) findViewById(R.id.ll_dots);
  //找到文本的对象.
  viewpager_tv = (TextView) findViewById(R.id.viewpager_tv);
  //找到VIewPager对象.
  viewpager_vp = (ViewPager) findViewById(R.id.viewpager_vp);

  //更加图片int数组资源的数量,动态的创建ImageView控件.就是有几张图片,创建几个ImageView,for循环
  for (int x = 0; x < imageResIds.length; x++) {
   //创建ImageView对象
   ImageView imageView = new ImageView(this);
   //通过该对象添加图片资源.setBackgroundResource方法.
   imageView.setBackgroundResource(imageResIds[x]);
   //把控件添加到集合ImageViews中去,以方便在VIewPager的适配器里instantiateItem方法获取.
   imageViews.add(imageView);
   //进行点的添加,其个数和图片的个数1致,因此放到该循环中.222
   dot();
  }

  //设置适配器.setAdapter
  viewpager_vp.setAdapter(new Myadapter());
  //设置ViewPager的滑动监听器,addOnPageChangeListener,set的方法因为名字的原因被淘汰了,在onPageScrolled中.222
  viewpager_vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {


   @Override
   public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    //同过getCurrentItem方法拿到当前用户所交互ViewPager的item位置.
    int currentItem = viewpager_vp.getCurrentItem();
    //通过得到的这个item,给text和点进行选中的设置.
    changeTextAndDot(currentItem % imageResIds.length);
    Log.d("aaa", "onPageScrolled: Position-" + position + " positionOffset-" + positionOffset + " positionOffsetPixels-" + positionOffsetPixels);

   }

   @Override
   public void onPageSelected(int position) {
    Log.d("aaa", "onPageSelected: position" + position);
   }

   @Override
   public void onPageScrollStateChanged(int state) {
    Log.d("aaa", "onPageScrollStateChanged: state" + state);
   }
  });
  //指定VIewPager默认跳转到某页.1般是最大数的1般.setCurrentItem就是设置VIewPager跳到哪页,get是获取.333
  viewpager_vp.setCurrentItem(Integer.MAX_VALUE / 2 - 3);

  //通过handler,3秒后开始循环ViwePager的item.sendEmptyMessageDelayed,333
  handler.sendEmptyMessageDelayed(1, 3000);
  //设置VIewPager的触摸事件.最后抽成方法.333
  ViewPagerTouchEvent();
 }

 /**
  * 注意:看1个方法或类的信息快捷键:Ctrl+Q;
  * 像ListVIew1样,创建1个ViewPager的适配器,自定义1个类继承PagerAdapter
  */
 private class Myadapter extends PagerAdapter {
  //getContent,设置ViewPager的条目个数.1般就是集合或者资源数组的长度.
  @Override
  public int getCount() {
   //把返回的条目设置为无限大.333
   //注意:1般和获取ViewPager当前选中的是第几页有关的都要改为position(当前页数)%list.size()(取余数),你就看哪报错,根据报错改333
   return Integer.MAX_VALUE;
  }

  //isViewFromObject,判断ViewPager的条目View对象和InstantiateItem返回的Object对象是否1致,固定格式:return view==object;
  @Override
  public boolean isViewFromObject(View view, Object object) {
   return view == object;
  }

  //Ctrl+H:看到1个类的基础结构图 ctrl+h+l:快速格式化.
  //instantiateItem,ViewPager添加条目的操作.container:VIewPager的化身,控件都是添加到他身上,position:代表用户滑动条目的位置
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
   //根据条目所在位置(利用Position),从ImageViews集合里获取相对应的ImageVIew图片.
   ImageView imageView = imageViews.get(position % imageResIds.length);
   //把得到ImageView对象,添加给VIewPager对象,也就是container,使用addView
   container.addView(imageView);
   //注意:你添加给VIewPager什么控件,就要返回该控件,给isViewFromObject进行比较判断,这里添加的是ImageView,返回的就是ImageView
   return imageView;
  }

  //防止内存泄漏.相当于ListView的复用container,销毁1个page,该方法的实际就是将instantiateItem返回的VIew对象从ViewPager中移除,
  //container:还是ViewPager控件自身 position: object:则代表了View控件,使用时要强转成View1下
  //补充:为什么参数是Object,而不直接是View,因为虽然99%是view,但也有可能是Fragment,所以用Object,提高了可扩展性.
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
   //构造方法删除后,也是固定格式:container.removeView((View) object);
   container.removeView((View) object);
  }
 }


 /**
  * 更加图片资源的数量,动态的创建点222
  */
 public void dot() {
  //创建1个View对象;
  View view = new View(this);
  //为这个View对象设置背景setBackgroundResource
  view.setBackgroundResource(R.drawable.dot_normal);
  //为View对象设置宽高参数,使用参数对象LayoutParams(int,int),给哪个容器,就用哪个容器创建
  LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8, 8);
  //使用参数对象LayoutParams.leftMargin=int,相当于布局里的padding.
  layoutParams.leftMargin = 8;
  //把准备好的layoutParams参数对象,设置给View对象.setLayoutParams
  view.setLayoutParams(layoutParams);
  //最后容器对象.addView(VIwe);
  ll_dots.addView(view);
 }


 /**
  * 根据ViewPager的item的变化,也就是图片切换的操作,设置对应的点和文本.222
  *
  * @param position int ViewPager的item,也是图片的位置
  */
 public void changeTextAndDot(int position) {
  //根据ViewPager的item的变化,设置对应的文本.setText(descs[position]);
  viewpager_tv.setText(descs[position]);
  //对点进行判断是否是当前页的点,用for循环,拿到所有点的位置,然后和position对比
  for (int x = 0; x < imageResIds.length; x++) {
   //.getChildAt(x);拿到容器的子控件.得到VIew对象
   View childAt = ll_dots.getChildAt(x);
   //为View设置背景图片,,使用3元运算符.
   childAt.setBackgroundResource(x == position ? R.drawable.dot_focus : R.drawable.dot_normal);
  }
 }

 /**
  * 该方法主要设置VIewPager的触摸事件,实现用户的触摸时,不再自动播放.switch中motionEvent.getActivity.333
  * 另1种实现的思路,是在ViewPager监听事件里面,对ViewPager的状态进行判断.闲置-滑动,和用户交互中-移除滑动.
  * public void onPageScrollStateChanged(int state) {
  * //当滑动状态发生改变的时候,手动滑动的时候,不能进行界面切换操作
  * //SCROLL_STATE_IDLE : 空闲状态
  * if (state == ViewPager.SCROLL_STATE_IDLE) {
  * //自动切换界面
  * handler.sendEmptyMessageDelayed(VIEWPAGER_SWITCH_PAGE, 3000);
  * }else{
  * //停止自动切换
  * //停止界面切换操作
  * handler.removeMessages(VIEWPAGER_SWITCH_PAGE);
  * }
  * }
  */
 public void ViewPagerTouchEvent() {
  viewpager_vp.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View view, MotionEvent motionEvent) {
    switch (motionEvent.getAction()) {
     case MotionEvent.ACTION_DOWN:
      //当时MotionEvent.ACTION_DOWN和ACTION_MOVE,就移除handler发送的message.removeMessages.333
      handler.removeMessages(1);
      break;
     case MotionEvent.ACTION_MOVE:
      handler.removeMessages(1);
      break;
     //当用户手松开时ACTION_UP,就继续使用sendEmptyMessageDelayed发送handler的消息.333
     case MotionEvent.ACTION_UP:
      handler.sendEmptyMessageDelayed(1, 3000);
     default:
      break;
    }
    return false;
   }
  });
 }


 @Override
 protected void onDestroy() {
  super.onDestroy();
  handler.removeMessages(1);
 }
}

activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <android.support.v4.view.ViewPager
  android:id="@+id/viewpager_vp"
  android:layout_width="wrap_content"
  android:layout_height="300dp" />
 <!--  Definition lineatLayout Hour ,background="#88000000",gravity="center_horizontal" padding="8dp"
   android:layout_alignBottom="@+id/viewpager_vp"  For small use 1 A LinearLayout To parcel .-->
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="#88000000"
  android:gravity="center_horizontal"
  android:padding="8dp"
  android:layout_alignBottom="@+id/viewpager_vp"
  android:orientation="vertical">
  <!-- The selection attribute of the state selector here is state_selected, Instead of state_pressed,
    Know the difference between them , Quote pictures drawable, Attention V Is capitalized ,
    Points are based on the number of pictures , Dynamically created , All our View Also note out .-->text
  <TextView
   android:id="@+id/viewpager_tv"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textColor="@android:color/white"
   android:text=" I'm a handsome guy "/>

  <LinearLayout
   android:id="@+id/ll_dots"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:orientation="horizontal"
   android:gravity="center_horizontal">
<!--   <View
    android:layout_width="5dp"
    android:layout_height="5dp"
    android:background="@drawable/dot_focus"/>-->
  </LinearLayout>
 </LinearLayout>
</RelativeLayout>

Related articles: