android 无限轮播图
来源:互联网 发布:p2p是什么软件 编辑:程序博客网 时间:2024/06/06 19:07
PicSlideView 自定义控件
package com.example.demo.view;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
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.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.example.demo.R;
import com.example.demo.utils.DensityUtils;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2017/10/31.
*/
public class PicSlideView extends FrameLayout implements ViewPager.OnPageChangeListener {
//图片的路径
private List<String> imgPath;
//设置动画的时间
private int time_interval = 3000;
private ViewPager mViewPager;
private Context mContext;
// 存放点的容器
private LinearLayout ll_point_container;
private MyPagerAdapter adapter;
public PicSlideView(@NonNull Context context) {
this(context, null);
}
public PicSlideView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public PicSlideView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
imgPath = new ArrayList<>();
new GetListTask().execute("");
}
public void setPath(List<String> imgPath) {
this.imgPath = imgPath;
}
private SwitchTask task;
public void startPlay() { //开始轮播
if (task == null) {
task = new SwitchTask();
}
task.start();
}
public void stopPlay() { //停止轮播
if (task == null) {
return;
}
task.stop();
}
public void init(Context mContext) {
if (imgPath == null || imgPath.size() == 0)
return;
LayoutInflater.from(mContext).inflate(R.layout.layout_pic_slide, this, true);
mViewPager = (ViewPager) findViewById(R.id.mViewPager);
ll_point_container = (LinearLayout) findViewById(R.id.ll_point_container);
adapter = new MyPagerAdapter();
mViewPager.setAdapter(adapter);
//设置初始位置 如果没有设置 刚开始时不能向左边滑动
mViewPager.setCurrentItem(imgPath.size() * 100);
for (int i = 0; i < imgPath.size(); i++) {
View point = new View(mContext);
point.setBackgroundResource(R.drawable.point_normal);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
DensityUtils.dp2px(mContext, 6),
DensityUtils.dp2px(mContext, 6));
if (i != 0) {
params.leftMargin = DensityUtils.dp2px(mContext, 6);
} else {
point.setBackgroundResource(R.drawable.point_selected);
}
//添加点
ll_point_container.addView(point, params);
}
mViewPager.addOnPageChangeListener(this);
mViewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (task != null) {
task.stop();
}
break;
case MotionEvent.ACTION_UP:
if (task != null) {
task.start();
}
break;
}
return false;
}
});
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
position = position % imgPath.size();
int childCount = ll_point_container.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = ll_point_container.getChildAt(i);
child.setBackgroundResource(i == position
? R.drawable.point_selected //选择选中和没有选中的图标
: R.drawable.point_normal);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
private class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
if (imgPath != null) {
//设置个数,实现无限轮播
return Integer.MAX_VALUE;
}
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position = position % imgPath.size();
ImageView iv = new ImageView(mContext);
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
//使用Picasso加载图片 可以替换成自己的加载图片控件
Picasso.with(mContext).load(imgPath.get(position)).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(iv);
container.addView(iv);
return iv;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
private class SwitchTask extends Handler implements Runnable {
@Override
public void run() {
// 设置viewpager选中下一个,如果已经是最后一个了,选中第0个
int item = mViewPager.getCurrentItem();
if (item == mViewPager.getAdapter().getCount() - 1) {
// 是最后一个
item = 0;
} else {
item++;
}
mViewPager.setCurrentItem(item);
// 再次执行
postDelayed(this, time_interval);
}
public void start() { //开始轮播
removeCallbacks(this);
postDelayed(this, time_interval);
}
public void stop() { //停止轮播
removeCallbacks(this);
}
}
/**
* 异步任务,获取数据
*/
class GetListTask extends AsyncTask<String, Integer, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
try {
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
init(mContext);
}
}
}
}
ll_point_container.xml 布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/mViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/ll_point_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:gravity="center"
android:orientation="horizontal">
</LinearLayout>
</RelativeLayout>
方法的在MainActivity调用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
picSlideView = (PicSlideView) mRootView.findViewById(R.id.picSlideView);
imgPaths = new ArrayList<String>();
imgPaths.add("");//图片的地址
imgPaths.add("");
imgPaths.add("");
imgPaths.add("");
picSlideView.setPath(imgPaths);
picSlideView.startPlay();
}
- android 无限轮播图
- android viewpager轮播图无限循环
- android ViewPager无限滚动、轮播图
- Android之无限轮播图源代码
- android 轮播图无限循环,自动播放
- android单向无限循环的轮播图效果。
- Android 超简单自动无限轮播图LoopView
- Android 无限循环的广告轮播图
- android中使用ViewPager实现无限轮播图
- Android组合控件(无限轮播图)
- Android——Banner无限轮播图
- 无限轮播图
- 无限轮播图
- 无限轮播图
- Android Gallery无限循环
- Android无限循环ViewPager
- [Android]无限循环ViewPager
- 记android ViewPager实现轮播图的无限滚动笔记
- ES学习
- Android移动开发-下拉刷新SwipeRefreshLayout的实现
- 欢迎使用CSDN-markdown编辑器
- JavaScript中数组Array的方法总结
- jsp之间获取参数
- android 无限轮播图
- 迭代器和生成器的一些注意问题
- mui初级入门教程(一)— 小白入手mui的学习路线
- Map集合
- 什么是restful
- Vue.js 上传文件(后台使用.net)
- Java
- iOS百度地图根据经纬度获取两点之间的距离
- ofbiz修复bug——使用内容组件创建博客文章时报错