Android實(shí)現(xiàn)ViewPager無(wú)限循環(huán)效果(一)
本文實(shí)例為大家分享了Android實(shí)現(xiàn)ViewPager無(wú)限循環(huán)的具體代碼,供大家參考,具體內(nèi)容如下
方式一:
實(shí)現(xiàn)原理:
假設(shè)有3張圖片,分別是1,2,3,那么就創(chuàng)建5張圖片,這5張圖片的順序?yàn)椋?,1,2,3,1,其中1,2,3為我們要實(shí)現(xiàn)滑動(dòng)的圖片,最左面的3和最右面的1是我們另外添加的圖片,開(kāi)始時(shí),顯示圖片1,當(dāng)圖片向左滑動(dòng)依次為1,2,3,當(dāng)從第3張圖片繼續(xù)向左滑動(dòng),會(huì)出現(xiàn)我們多添加的圖片1,這時(shí),將當(dāng)前的index設(shè)置為真正的圖片1所在的位置。
package com.xiaomai.myproject.demo;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.xiaomai.myproject.R;
import com.xiaomai.myproject.adapter.LoopViewPagerAdapter;
import com.xiaomai.myproject.base.BaseActivity;
import com.xiaomai.myproject.utils.Utils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by XiaoMai on 2016/10/7 17:19.
*
*/
public class LoopViewPagerDemoActivity extends BaseActivity {
/**
* 更新圖片的時(shí)間
*/
private static final int UPDATE_TIME = 3 * 1000;
private ViewPager mViewPager;
private LoopViewPagerAdapter mLoopViewPager;
/**
* 圖片資源集合
*/
private int[] mImageIds;
/**
* 圖片集合
*/
private List<ImageView> mImageList;
/**
* 當(dāng)前廣告的index
*/
private int mCurrentPageIndex;
/**
* 指示Point
*/
private LinearLayout mLinearLayoutPoints;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
mHandler.postDelayed(myRunnable, UPDATE_TIME);
}
@Override
protected void onPause() {
super.onPause();
mHandler.removeCallbacks(myRunnable);
}
Runnable myRunnable = new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(mCurrentPageIndex + 1);
}
};
@Override
protected void initVariables() {
super.initVariables();
}
@Override
protected void initViews() {
mLinearLayoutPoints = (LinearLayout) findViewById(R.id.activity_ll_container);
mViewPager = (ViewPager) findViewById(R.id.activity_loop_viewpager);
}
@Override
protected void loadData() {
super.loadData();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
/**
* 初始化圖片的資源id
*/
mImageIds = new int[]{
R.mipmap.ic_launcher,
R.mipmap.ic_launcher,
R.drawable.my_toast,
R.drawable.my_toast};
/**
* 添加ImageView
*/
mImageList = new ArrayList<>();
//額外添加兩張圖片
int pagerCount = mImageIds.length + 2;
ViewGroup.LayoutParams layoutParams =
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
for (int i = 0; i < pagerCount; i++) {
ImageView imageView = new ImageView(mContext);
imageView.setLayoutParams(layoutParams);
mImageList.add(imageView);
}
//圓點(diǎn)的直徑
int diameter = Utils.dip2px(mContext,10f);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(diameter, diameter);
int margin = Utils.dip2px(mContext,5f);
params.setMargins(margin,margin,margin,margin);
mLinearLayoutPoints.removeAllViews();
for (int i = 0; i < mImageList.size(); i++) {
View view = new View(mContext);
view.setLayoutParams(params);
if (i != 0 && i != mImageList.size() - 1) {
view.setBackgroundResource(R.drawable.circle_normal);
}
mLinearLayoutPoints.addView(view);
}
mLinearLayoutPoints.setVisibility(View.VISIBLE);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mHandler.removeCallbacks(myRunnable);
mHandler.postDelayed(myRunnable, UPDATE_TIME);
mCurrentPageIndex = position;
if (position == 0) {
// 當(dāng)視圖在第一個(gè)時(shí),將頁(yè)面號(hào)設(shè)置為圖片的最后一張。
mCurrentPageIndex = mImageIds.length;
} else if (position == mImageIds.length + 1) {
// 當(dāng)視圖在最后一個(gè)時(shí),將頁(yè)面號(hào)設(shè)置為圖片的第一張。
mCurrentPageIndex = 1;
} else {
}
/**
* 當(dāng)視圖在第一個(gè)或者最后一個(gè)時(shí),pageIndex和position的值不相等,
* 所以要改變viewPager的當(dāng)前item。
*/
if (position != mCurrentPageIndex) {
/**
* 第二參數(shù)必須設(shè)置為false,意思是立即過(guò)渡,不給用戶視覺(jué)上的效果。
*/
mViewPager.setCurrentItem(mCurrentPageIndex, false);
return;
}
for (int i = 1; i < mLinearLayoutPoints.getChildCount() - 1; i++) {
if (i != mCurrentPageIndex){
mLinearLayoutPoints.getChildAt(i).setBackgroundResource(R.drawable.circle_normal);
}else {
mLinearLayoutPoints.getChildAt(mCurrentPageIndex).setBackgroundResource(
R.drawable.circle_select);
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
/**
* 當(dāng)ViewPager被按下的時(shí)候,取消自動(dòng)滾動(dòng)
* 反之開(kāi)啟自動(dòng)滑動(dòng)。
*/
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
mHandler.removeCallbacks(myRunnable);
}else if (event.getAction() == MotionEvent.ACTION_UP){
mHandler.postDelayed(myRunnable, UPDATE_TIME);
}
return false;
}
});
mLoopViewPager = new LoopViewPagerAdapter(mImageList, mImageIds);
mViewPager.setAdapter(mLoopViewPager);
/**
* 因?yàn)榈?個(gè)item是另外添加的那張圖片,所以初始化時(shí)要把當(dāng)前item設(shè)置為1。
*/
mViewPager.setCurrentItem(1);
dissMissProgressDialog();
}
}, 3 * 1000);
}
@Override
protected int getContentLayout() {
return R.layout.act_loopviewpager;
}
}
package com.xiaomai.myproject.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 XiaoMai on 2016/10/7 17:23.
*/
public class LoopViewPagerAdapter extends PagerAdapter {
private List<ImageView> mImageList;
private int[] mImageIds;
public LoopViewPagerAdapter(List<ImageView> mImageList, int[] mImageIds) {
this.mImageList = mImageList;
this.mImageIds = mImageIds;
}
@Override
public int getCount() {
return mImageList == null ? 0 : mImageList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (position == 0) {
// 如果是第0個(gè)item就設(shè)置它的圖片內(nèi)容為最后一個(gè)圖片的內(nèi)容
mImageList.get(position).setImageResource(mImageIds[mImageIds.length-1]);
} else if (position == (mImageList.size() - 1)) {
// 如果是最后一個(gè)item就設(shè)置它的圖片內(nèi)容為第一個(gè)圖片的內(nèi)容
mImageList.get(position).setImageResource(mImageIds[0]);
} else {
// 這是正常的圖片
mImageList.get(position).setImageResource(mImageIds[position - 1]);
}
container.addView(mImageList.get(position));
return mImageList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mImageList.get(position));
}
}
布局文件
<?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"> <include android:id="@+id/titleBar" layout="@layout/my_app_bar" /> <android.support.v4.view.ViewPager android:id="@+id/activity_loop_viewpager" android:layout_width="match_parent" android:layout_height="200dp" android:layout_below="@id/titleBar" /> <LinearLayout android:id="@+id/activity_ll_container" android:layout_width="match_parent" android:orientation="horizontal" android:gravity="center" android:background="@color/toast" android:layout_alignBottom="@id/activity_loop_viewpager" android:visibility="gone" android:layout_height="40dp"/> </RelativeLayout>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 使用viewpager實(shí)現(xiàn)無(wú)限循環(huán)(定時(shí)+手動(dòng))
- Android viewpager中動(dòng)態(tài)添加view并實(shí)現(xiàn)偽無(wú)限循環(huán)的方法
- Android ViewPager無(wú)限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動(dòng)態(tài)滑動(dòng)
- Android ViewPager無(wú)限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)完整實(shí)例
- Android無(wú)限循環(huán)RecyclerView的完美實(shí)現(xiàn)方案
- Android ViewPager實(shí)現(xiàn)無(wú)限循環(huán)效果
- Android實(shí)現(xiàn)帶指示點(diǎn)的自動(dòng)輪播無(wú)限循環(huán)效果
- Android實(shí)現(xiàn)基于ViewPager的無(wú)限循環(huán)自動(dòng)播放帶指示器的輪播圖CarouselFigureView控件
- Android實(shí)戰(zhàn)打飛機(jī)游戲之無(wú)限循環(huán)的背景圖(2)
- Android TV 3D卡片無(wú)限循環(huán)效果
相關(guān)文章
Kotlin+buildSrc更好的管理Gradle依賴譯文
這篇文章主要為大家介紹了Kotlin+buildSrc更好的管理Gradle依賴譯文及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Flutter?fluro時(shí)報(bào)錯(cuò)type?'String'?is?not?a?subty
這篇文章主要介紹了Flutter使用fluro時(shí)報(bào)錯(cuò)type?'String'?is?not?a?subtype?of?type?'Queue<Task>'解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-12-12
android高仿小米時(shí)鐘(使用Camera和Matrix實(shí)現(xiàn)3D效果)
這篇文章主要介紹了android高仿小米時(shí)鐘(使用Camera和Matrix實(shí)現(xiàn)3D效果),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01
Android Studio利用AChartEngine制作餅圖的方法
閑來(lái)無(wú)事,發(fā)現(xiàn)市面上好多app都有餅圖統(tǒng)計(jì)的功能,得空自己實(shí)現(xiàn)一下,下面這篇文章主要給大家介紹了關(guān)于Android Studio利用AChartEngine制作餅圖的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧2018-10-10
android控件實(shí)現(xiàn)單擊拖動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了android控件實(shí)現(xiàn)單擊拖動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
Flutter使用sqflite處理數(shù)據(jù)表變更的方法詳解
了解過(guò)數(shù)據(jù)庫(kù)的同學(xué)應(yīng)該會(huì)知道,數(shù)據(jù)表結(jié)構(gòu)是可能發(fā)生改變的。所以本文為大家介紹了Flutter?使用?sqflite?處理數(shù)據(jù)表變更的版本升級(jí)處理方法,感興趣的可以了解一下2023-04-04
Flutter實(shí)現(xiàn)視頻壓縮功能的示例代碼
移動(dòng)應(yīng)用程序中,視頻占用了大量的存儲(chǔ)空間和帶寬,這在一定程度上影響了應(yīng)用程序的性能和用戶體驗(yàn),所以本文為大家準(zhǔn)備了Flutter實(shí)現(xiàn)視頻壓縮的方法,需要的可以參考一下2023-06-06
Flutter學(xué)習(xí)教程之Route跳轉(zhuǎn)以及數(shù)據(jù)傳遞
這篇文章主要給大家介紹了關(guān)于Flutter學(xué)習(xí)教程之Route跳轉(zhuǎn)以及數(shù)據(jù)傳遞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
淺談Android Studio導(dǎo)出javadoc文檔操作及問(wèn)題的解決
這篇文章主要介紹了淺談Android Studio導(dǎo)出javadoc文檔操作及問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

