无线轮播android,android实现主流APP无限轮播

直接上代码,代码里边都有注释。

自定义ViewPager,自定义主要是为了处理用户手指按下停止轮播,抬起继续轮播事件 。

package com.example.administrator.ximalayademo.view;

import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.view.MotionEvent;

/**

* 自定义ViewPage

*/

public class BannerViewPage extends ViewPager {

private OnBannerViewPageTouchListener mTouchListener;

public BannerViewPage(Context context) {

super(context);

}

public BannerViewPage(Context context, AttributeSet attrs) {

super(context, attrs);

}

/**

* 判断触摸事件

*

* @param ev

* @return

*/

@Override

public boolean onTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN: //手指按下

setIsTouch(true);

break;

case MotionEvent.ACTION_UP: //手指抬起

setIsTouch(false);

break;

}

return super.onTouchEvent(ev);

}

public void setOnBannerViewPageTouchListener(OnBannerViewPageTouchListener listener) {

mTouchListener = listener;

}

public interface OnBannerViewPageTouchListener {

void onBannerPageTouch(boolean isTouch);

}

private void setIsTouch(boolean isTouch) {

if (mTouchListener != null) {

mTouchListener.onBannerPageTouch(isTouch);

}

}

}

adapter:

package com.example.administrator.ximalayademo.adapter;

import android.support.v4.view.PagerAdapter;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import java.util.List;

/**

* Created by Administrator on 2019/4/12.

*/

public class LooperPageAdapter extends PagerAdapter {

private List mImage = null;

@Override

public int getCount() {

if (mImage != 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) {

int rePosition = position % mImage.size();

//创建ImageView并且设置ImageView的背景图

ImageView imageView = new ImageView(container.getContext());

imageView.setImageResource(mImage.get(rePosition));

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

//将设置好的ImageView设置到容器中

container.addView(imageView);

return imageView;

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView((View) object);

}

/**

* 设置数据

*

* @param image

*/

public void setData(List image) {

mImage = image;

}

/**

* 获取数据大小,此方法是用来设置用户往左边滑动时的操作

*

* @return

*/

public int getDataSize() {

if (mImage != null) {

return mImage.size();

}

return 0;

}

}

普通shape 文件(指示点,白色):

android:shape="oval">

android:width="30px"

android:height="30px" />

当前shape文件(指示点,橙色):

android:shape="oval" >

android:width="30px"

android:height="30px"/>

AndroidManifest:

package="com.example.administrator.ximalayademo">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

布局文件:

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/looper_page"

android:layout_width="match_parent"

android:layout_height="200dp"

android:overScrollMode="never" />

android:id="@+id/linearLayout_point"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@id/looper_page"

android:layout_marginTop="-20dp"

android:gravity="center"

android:orientation="horizontal" />

Activity:

package com.example.administrator.ximalayademo;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.support.annotation.Nullable;

import android.support.v4.view.ViewPager;

import android.view.View;

import android.widget.LinearLayout;

import com.example.administrator.ximalayademo.adapter.LooperPageAdapter;

import com.example.administrator.ximalayademo.view.BannerViewPage;

import java.util.ArrayList;

import java.util.List;

/**

* 轮播Activity

*/

public class LooperPageActivity extends Activity {

private BannerViewPage mLooperPage;

private LooperPageAdapter mLooperPageAdapter;

private static final List sImage = new ArrayList<>();

private boolean mIsTouch = false;

private LinearLayout linearLayout_point;

//加载图片资源

static {

sImage.add(R.mipmap.banner1);

sImage.add(R.mipmap.banner2);

sImage.add(R.mipmap.banner3);

}

private Handler mHandler;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_looper_page);

initView();

//创建一个Handler实现自动轮播

mHandler = new Handler();

}

/**

* 当界面绑定到窗口

*/

@Override

public void onAttachedToWindow() {

super.onAttachedToWindow();

mHandler.post(mRunnableTask);

}

/**

* 当界面从窗口解绑

*/

@Override

public void onDetachedFromWindow() {

super.onDetachedFromWindow();

mHandler.removeCallbacks(mRunnableTask);

}

/**

* 自动轮播线程

* mIsTouch:如果 = false,表示用户手指没触摸按下,则轮播,如果 = true 表示用户手指触摸按下,停止轮播

*/

private Runnable mRunnableTask = new Runnable() {

@Override

public void run() {

if (!mIsTouch) {

int currentItem = mLooperPage.getCurrentItem();

mLooperPage.setCurrentItem(++currentItem, true);

}

mHandler.postDelayed(this, 3000);

}

};

/**

* 初始化控件

*/

private void initView() {

mLooperPage = (BannerViewPage) findViewById(R.id.looper_page);

mLooperPageAdapter = new LooperPageAdapter();

mLooperPageAdapter.setData(sImage);

mLooperPage.setAdapter(mLooperPageAdapter);

//设置初始位置,最好不要是第一个,如果是第一个将不能向前滑动。

mLooperPage.setCurrentItem(mLooperPageAdapter.getDataSize() * 100, false);

//设置自定义接口

mLooperPage.setOnBannerViewPageTouchListener(OnTouchListener);

mLooperPage.addOnPageChangeListener(OnPageChangeListener);

//获取页面的容器控件

linearLayout_point = (LinearLayout) findViewById(R.id.linearLayout_point);

insertPoint();

}

/**

* 根据图片的数量动态创建View的数量,然后AddView到页面的容器控件(linearLayout_point)

*/

private void insertPoint() {

for (int i = 0; i < sImage.size(); i++) {

View point = new View(this);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(30, 30);

point.setBackground(getResources().getDrawable(R.drawable.shape_point_normal));

params.leftMargin = 20;

point.setLayoutParams(params);

linearLayout_point.addView(point);

}

}

/**

* 捕获到当前显示轮播图位置

*/

private ViewPager.OnPageChangeListener OnPageChangeListener = new ViewPager.OnPageChangeListener() {

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override

public void onPageSelected(int position) {

int rePosition;

if (mLooperPageAdapter.getDataSize() != 0) {

rePosition = position % mLooperPageAdapter.getDataSize();

} else {

rePosition = 0;

}

setPosition(rePosition);

}

@Override

public void onPageScrollStateChanged(int state) {

}

};

private void setPosition(int position) {

for (int i = 0; i < linearLayout_point.getChildCount(); i++) {

View point = linearLayout_point.getChildAt(i);

if (i != position) {

//普通颜色的点

point.setBackground(getResources().getDrawable(R.drawable.shape_point_normal));

} else {

//选中颜色的点

point.setBackground(getResources().getDrawable(R.drawable.shape_point_selected));

}

}

}

/**

* 实现自定义接口

*/

private BannerViewPage.OnBannerViewPageTouchListener OnTouchListener = new BannerViewPage.OnBannerViewPageTouchListener() {

@Override

public void onBannerPageTouch(boolean isTouch) {

mIsTouch = isTouch;

}

};

}

2b40bad96840

Screenrecorder-2019-04-16-10-18-25-549[1].gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值