您的位置:首页 > 其它

安卓轮播图的实现(自定义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