安卓轮播图的实现(自定义view)
2017-10-13 09:33
344 查看
/******************************************************* * @author: wukai * * * * * * @date: 2017/10/12 * * * * @description: * * * * * * @version 1.0 * 主界面设置* * * * * *******************************************************/ public class MainActivity extends AppCompatActivity { VerticalText mVerticalText; ArrayList<String> mList; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dai_main); }}
=============================xml设置===========================================
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="160dp"> <com.slideshow.com.comslideshowcom.SlidSowView android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
</LinearLayout>==========================================自定义view============================
package com.slideshow.com.comslideshowcom; import android.content.Context; import android.os.Handler; import android.os.Message; import android.support.annotation.AttrRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /******************************************************* * @author: wukai * * * * * * @date: 2017/10/12 * * * * @description: * * * * * * @version 1.0 * 自定义轮播图* * * * * *******************************************************/ public class SlidSowView extends FrameLayout { //自动轮播启用开关 public static final boolean isAutoPlay = true; private Context mContext; ArrayList<String> mList; ArrayList<ImageView> mImageViews; ArrayList<View> mViews; //当前轮播页 private int currentItem = 0; //定时任务 private ScheduledExecutorService mScheduledExecutorService; ViewPager mViewPager; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { mViewPager.setCurrentItem(currentItem); } }; public SlidSowView(@NonNull Context context) { this(context, null); } public SlidSowView(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public SlidSowView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; //初始化数据 initData(); } private void initData() { mImageViews = new ArrayList<>(); mViews = new ArrayList<>(); //初始化布局 initUI(mContext); //初始化定时任务的方法 initTimer(); } private void initTimer() { mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); mScheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 5, TimeUnit.SECONDS); /*new SlideShowTask()是一个实现Runnable接口的类,会自动运行里面的run()方法,1的意思就是启动等待时间,这里就是直接运行, 5是5秒,要是想小时,就把TimeUnit.SECONDS TimeUnit.HOURS,分钟是TimeUnit.MINUTES*/ } //执行轮播图切换任务 private class SlideShowTask implements Runnable { @Override public void run() { currentItem = (currentItem + 1) % mImageViews.size(); mHandler.obtainMessage().sendToTarget(); } } private void initUI(Context context) { LayoutInflater.from(context).inflate(R.layout.slidsow, this, true); LinearLayout douLayout = (LinearLayout) findViewById(R.id.linearlatouy_slidsow); douLayout.removeAllViews(); //显示图片 ImageView view1 = new ImageView(mContext); view1.setBackgroundResource(R.drawable.a); ImageView view2 = new ImageView(mContext); view2.setBackgroundResource(R.drawable.b); ImageView view3 = new ImageView(mContext); view3.setBackgroundResource(R.drawable.c); ImageView view4 = new ImageView(mContext); view4.setBackgroundResource(R.drawable.d); mImageViews.add(view1); mImageViews.add(view2); mImageViews.add(view3); mImageViews.add(view4); //小点 for (int i = 0; i < mImageViews.size(); i++) { //初始化轮播图的点击监听事件 mImageViews.get(i).setId(i); mImageViews.get(i).setOnClickListener(new MyListener()); View pointView = new View(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10); //初始化圆点以及颜色 if (i == 0) { pointView.setBackgroundResource(R.color.colorAccent); } else { pointView.setBackgroundResource(R.color.colorPrimary); } params.leftMargin = 10; pointView.setLayoutParams(params); mViews.add(pointView); //将小点添加到布局中去 douLayout.addView(pointView, params); } mViewPager = (ViewPager) findViewById(R.id.viewpager_slidsow); //启动适配器 MyPagerAdaapter adaapter = new MyPagerAdaapter(); mViewPager.setFocusable(true); mViewPager.setAdapter(adaapter); //初始化轮播图的滑动监听事件 mViewPager.setOnPageChangeListener(new MyPageChangeListener()); //设置初始化需要显示的条目数 mViewPager.setCurrentItem(0); } //自定义轮播图点击事件 class MyListener implements OnClickListener { @Override public void onClick(View view) { switch (view.getId()) { case 0: Toast.makeText(mContext, "点击的是第一张轮播图!", Toast.LENGTH_SHORT).show(); break; case 1: Toast.makeText(mContext, "点击的是第二张轮播图!", Toast.LENGTH_SHORT).show(); break; case 2: Toast.makeText(mContext, "点击的是第三张轮播图!", Toast.LENGTH_SHORT).show(); break; case 3: Toast.makeText(mContext, "点击的是第四张轮播图!", Toast.LENGTH_SHORT).show(); break; } } } //自定义PageChangeListener class MyPageChangeListener implements ViewPager.OnPageChangeListener { //滑动被调用 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } //滑动状态被选定 @Override public void onPageSelected(int position) { currentItem = position; for (int i = 0; i < mViews.size(); i++) { if (i == position) { mViews.get(i).setBackgroundResource(R.color.colorAccent); } else { mViews.get(i).setBackgroundResource(R.color.colorPrimary); } } } //滑动状态改变时 @Override public void onPageScrollStateChanged(int state) { } } //自定义PagerAdapter class MyPagerAdaapter extends PagerAdapter { //返回轮播图的最大显示条目数 @Override public int getCount() { return mImageViews.size(); } //判断View是否可复用 @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //返回要显示的条目,并创建条目 @Override public Object instantiateItem(ViewGroup container, int position) { int newPosition = position % mImageViews.size(); ImageView imageView = mImageViews.get(newPosition); container.addView(imageView); return imageView; } //销毁看不到的条目 @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mImageViews.get(position)); } } }=======================================xml=============================================
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/viewpager_slidsow" android:layout_width="match_parent" android:layout_height="match_parent"/> <LinearLayout android:id="@+id/linearlatouy_slidsow" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center" android:orientation="horizontal" android:padding="8dp"> </LinearLayout> </RelativeLayout>
相关文章推荐
- 安卓实现汉字轮播(自定义view)
- 安卓开发笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑效果)
- 自定义ViewPager实现图片自动轮播无限循环
- Android之自定义ViewPager实现图片的无线轮播
- 安卓复杂滑动案例 自定义behavior源码分析 实现头布局图片的缩放透明度变化,RecycleView的滑动布局,坐标变化
- 安卓通过自定义view实现水波进度条控件
- 安卓自定义View画钟实现转动
- 手把手教你用ViewPager自定义实现Banner轮播
- android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View
- 安卓自定义View实现课程表
- 使用viewGrop自定义轮播图中实现图片自适应手机屏幕的宽度
- 自定义View实现安卓裁剪图片
- 自定义View之无限轮播Banner的实现:STBanner
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View---转
- 安卓自定义View----且看如何巧妙地实现一个类似于电视遥控板的环形按钮效果(上)
- 自定义view实现无限轮播
- 自定义View之无限轮播Banner的实现:STBanner
- 安卓webview长按分享,长按选择,长按复制,仿好奇心日报长按分享自定义弹窗的实现
- 安卓双向范围取值选择器,双向选择进度条,单向选择进度条自定义视图View实现