1. 程式人生 > >android中無限輪播圖的實現(程式碼+文章+視訊)

android中無限輪播圖的實現(程式碼+文章+視訊)

Android開發中無限輪播圖的實現

前面在我們的論壇裡頭看到有同學們提問,怎麼樣去實現無限輪播。所以晚上回來就錄製了視訊了!

這裡寫圖片描述

實現方式

最簡單的方式,就是使用viewpager來實現咯!
我們一開始只是實現圖片在viewPager上面可以滑動起來

但是我現在已經把所有的程式碼寫完了,哈哈!
所以大家就看程式碼好了!

這是主介面的佈局,也就是MainActivity的佈局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="200dp" tools:context=".MainActivity">
<com.sunofbeaches.looperpager.MyViewPager android:id="@+id/looper_pager" android:layout_width="match_parent" android:layout_height
="200dp"/>
<LinearLayout android:id="@+id/points_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="40px" android:gravity="center" android:orientation
="horizontal">
<!--<View--> <!--android:layout_width="40px"--> <!--android:layout_height="40px"--> <!--android:background="@drawable/shape_point_selected"/>--> <!--<View--> <!--android:layout_width="40px"--> <!--android:layout_height="40px"--> <!--android:layout_marginLeft="20px"--> <!--android:background="@drawable/shape_point_normal"/>--> </LinearLayout> </RelativeLayout>

然後呢,也不用給大家看預覽圖了,很簡單,一個viewpager,一個指示器點的容器。

接下來是MainActivity的程式碼:

package com.sunofbeaches.looperpager;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity implements MyViewPager.OnViewPagerTouchListener, ViewPager.OnPageChangeListener {

    private static final String TAG = "MainActivity";
    private MyViewPager mLoopPager;
    private LooperPagerAdapter mLooperPagerAdapter;

    private static List<Integer> sPics = new ArrayList<>();

    static {
        sPics.add(R.mipmap.pic1);
        sPics.add(R.mipmap.pic2);
        sPics.add(R.mipmap.pic3);
    }

    private Handler mHandler;
    private boolean mIsTouch = false;
    private LinearLayout mPointContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

//        Random random = new Random();
//        //準備資料
//        for (int i = 0; i < 5; i++) {
//            sColos.add(Color.argb(random.nextInt(255), random.nextInt(255), random.nextInt(255), random.nextInt(255)));
//        }

        //給介面卡設定資料
        //mLooperPagerAdapter.setData(sColos);
        //
        //mLooperPagerAdapter.notifyDataSetChanged();
        mHandler = new Handler();
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        //當我這個介面繫結到視窗的時候
        mHandler.post(mLooperTask);
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        Log.d(TAG, "onDetachedFromWindow");
        mHandler.removeCallbacks(mLooperTask);
    }

    private Runnable mLooperTask = new Runnable() {
        @Override
        public void run() {
            if (!mIsTouch) {
                //切換viewPager裡的圖片到下一個
                int currentItem = mLoopPager.getCurrentItem();
                mLoopPager.setCurrentItem(++currentItem, true);
            }
            mHandler.postDelayed(this, 3000);
        }
    };

    private void initView() {
        //就是找到這個viewPager控制元件
        mLoopPager = (MyViewPager) this.findViewById(R.id.looper_pager);
        //設定介面卡
        mLooperPagerAdapter = new LooperPagerAdapter();
        mLooperPagerAdapter.setData(sPics);
        mLoopPager.setAdapter(mLooperPagerAdapter);
        mLoopPager.setOnViewPagerTouchListener(this);
        mLoopPager.addOnPageChangeListener(this);
        mPointContainer = (LinearLayout) this.findViewById(R.id.points_container);
        //根據圖片的個數,去新增點的個數
        insertPoint();
        mLoopPager.setCurrentItem(mLooperPagerAdapter.getDataRealSize() * 100, false);
    }

    private void insertPoint() {
        for (int i = 0; i < sPics.size(); i++) {
            View point = new View(this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);
            point.setBackground(getResources().getDrawable(R.drawable.shape_point_normal));
            layoutParams.leftMargin = 20;
            point.setLayoutParams(layoutParams);
            mPointContainer.addView(point);
        }
    }

    @Override
    public void onPagerTouch(boolean isTouch) {
        mIsTouch = isTouch;
    }


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

    }

    @Override
    public void onPageSelected(int position) {
        //這個方法的呼叫,其實是viewPager停下來以後選中的位置
        int realPosition;
        if (mLooperPagerAdapter.getDataRealSize() != 0) {
            realPosition = position % mLooperPagerAdapter.getDataRealSize();
        } else {
            realPosition = 0;
        }
        setSelectPoint(realPosition);
    }

    private void setSelectPoint(int realPosition) {
        for (int i = 0; i < mPointContainer.getChildCount(); i++) {
            View point = mPointContainer.getChildAt(i);
            if (i != realPosition) {
                //那就是白色
                point.setBackgroundResource(R.drawable.shape_point_normal);
            } else {
                //選中的顏色
                point.setBackgroundResource(R.drawable.shape_point_selected);
            }
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}

對了,為什麼前面的佈局一個是自定義的ViewPager呢?因為我們要處理一下事件,當我們觸控的頁面的時候,就停止自動切換到下一張圖片,所以我們就寫了一個自己的viewPager去修改一下:

package com.sunofbeaches.looperpager;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * Created by TrillGates on 18/4/23.
 * God bless my code!
 */
public class MyViewPager extends ViewPager {

    private OnViewPagerTouchListener mTouchListener = null;

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyViewPager(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (mTouchListener != null) {
                    mTouchListener.onPagerTouch(true);
                }
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                if (mTouchListener != null) {
                    mTouchListener.onPagerTouch(false);
                }
                break;
        }
        return super.onTouchEvent(ev);
    }

    public void setOnViewPagerTouchListener(OnViewPagerTouchListener listener) {
        this.mTouchListener = listener;
    }

    public interface OnViewPagerTouchListener {
        void onPagerTouch(boolean isTouch);
    }

}

還有一個東西,當然是介面卡啦!

package com.sunofbeaches.looperpager;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.List;

/**
 * Created by TrillGates on 18/4/23.
 * God bless my code!
 */
public class LooperPagerAdapter extends PagerAdapter {

    private List<Integer> mPics = null;

    @Override
    public int getCount() {
        if (mPics != null) {
            return Integer.MAX_VALUE;
        }
        return 0;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        int realPosition = position % mPics.size();
        ImageView imageView = new ImageView(container.getContext());
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        //imageView.setBackgroundColor(mPics.get(position));
        imageView.setImageResource(mPics.get(realPosition));
        //設定完資料以後,就新增到容器裡
        container.addView(imageView);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    public void setData(List<Integer> colos) {
        this.mPics = colos;
    }

    public int getDataRealSize() {
        if (mPics != null) {
            return mPics.size();
        }
        return 0;
    }
}

實現的效果:
這裡寫圖片描述

好啦今天文章就到這裡了,程式碼可以到githut上面去下載,感謝您的支援!

相關推薦

android無限實現程式碼+文章+視訊

Android開發中無限輪播圖的實現 前面在我們的論壇裡頭看到有同學們提問,怎麼樣去實現無限輪播。所以晚上回來就錄製了視訊了! 實現方式 最簡單的方式,就是使用viewpager來實現咯! 我們一開始只是實現圖片在viewPager上面可以滑動起

Bootstrap實現基於carousel.js框架的效果無過渡動畫

宣告式觸發需要使用到的幾個data-*屬性 1.data-ride:作用在最外層容器上,固定值:carousel 2.data-target:作用在class=carousel-indicator

JQuery 基礎案例3—— jQuery實現無縫無回滾滾動切換效果

輪播圖無縫滾動切換原理 基本框架 <div class="slide"> <!-- 導航點 --> <ul class="slide-nav"> <li class="activ

Android自動無限viewpager的使用

1、具體步驟     說下大概實現步驟,一般我們有兩種,一種是viewpager+作為遊標的點 。另外一種是重寫viewpager。       效果圖: 1.1 佈局,直接viewpager+一個viewgroup就好。<RelativeLayout xmlns:an

簡單3淡入淡出

html部分 <html> <head> <meta charset="UTF-8"> <title>輪播圖淡入淡出</title> <

VUE 安裝 外掛vue-awesome-swiper

npm install vue-awesome-swiper--save//import 引入import Vue from 'vue'import VueAwesomeSwiper from 'vue-awesome-swiper'<template>    <div>    &l

Android 實現 一 :三方框架 自定義viewPager CircleViewPager.實現無限

使用流程:1  。 gradle中新增依賴compile 'com.zhpan.library:viewpager:1.0.3'2.在xml檔案中新增如下程式碼:<com.zhpan.viewpager.view.CircleViewPager andr

Android 實現效果 底部圓點狀態改變

自動輪播和手動輪播之後應該實現圓點的切換 自定義改變圓點狀態的監聽器 新建介面public interface DotChangeListener,新增方法void dotChangeListener(int index);並在ImageBannerFramLayout實

iOS最笨的辦法實現無限網路載入

簡單的做了一下: 使用方法: 把 請求返回的 圖片地址(字串型別)放進陣列中就行 可以使用SDWebImage(我就是用的這個)等。。需要自己匯入並引用,然後修改部分程式碼 .h檔案 // ScrollViewTimerView.h // Scrol

Android組合控制元件無限

android 自定義控制元件 是的,真的是自定義控制元件。 相對於自定義控制元件的控制元件是什麼呢?當然是原生的控制元件啦! 比如說: 1、Button 、TextView 、ImageView 、EditText等(view)。 2、LinearLayout

Android 無限空白問題不是針對1張或者2張圖片的情況

前序 大家常說,無圖言luan,今天的的確沒有截圖,主要是分享下自己在“無限輪播圖上遇到的問題”,望各位老鐵見諒 問題描述 主頁面上有四個Fragment,類似於微信上的頁面佈局,有個fragme

微信小程式學習筆記----初識小程式程式碼實現

從這一節開始我們就開始接觸小程式前臺程式碼了,其實前臺邏輯還是比較簡單的,學習難度比學習一個前端框架難不了多少,記得以前一開始學前端框架的時候,流程就是:熟悉一下--檢視元件--找到要用的--複製貼上,其實對於大部分人來說,小程式前臺也是一樣。 首先,我們可以先看下小程式的

Banner和ImageLoder無限精簡版

1.首先先在程式中匯入我們要使的依賴 implementation 'com.youth.banner:banner:1.4.9' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

使用CollectionView實現無限(自動和手動輪)

使用UICollectionView封裝了一個無限迴圈的輪播圖,實現手動輪播和定時器自動輪播,傳入圖片陣列和標題陣列,即可實現圖片文字的輪播圖,並有點選事件,實現代理方法可實現點選事件的處理 ///呼叫 class HomeViewController: B

Android 超簡單自動無限

ArrayList<String> Adlist = new ArrayList<>(); mBannerView.setImgUrlData(Adlist); mBannerView.setOnHeaderViewClickLis

iOS:UICollectionView實現無限(Swift3)

效果圖 原理:給collectionView設定多組一樣的資料,預設展示中間的那一組.當滾動到上一組或者下一組的時候採用無動畫的方式滾動到最中間的那一組.這樣就實現了檢視的無限輪播. class

安卓最簡單的實現無限

Android中的輪播圖實現起來並不難,現在特別是商城類的APP中使用的特別多,自定義view和ViewPager都能很簡單的實現,之前找了幾篇博文都不具備無限輪播的功能,現在自己實現了無限輪播的功能,供大家參考學習和使用~~~~ 先看效果圖: 下面就看一下具體的程

android 程式碼實現功能靜態+動態視訊

分享下靜態截圖的功能程式碼: public class ScreenShot { // 獲取指定Activity的截圖,儲存到png檔案 static Bitmap takeScreenShot(Activity activity) { L

Android使用webview時,webview顯示不正常

1,先去看看ios端是不是有同樣的問題,如果有就是後臺的問題。 2,確定不是後臺的問題,去試一下這個網址在自己手機瀏覽器是否有問題。 3,兩者都沒問題就是自己程式碼的原因了。 4,圖片可以顯示,但是沒有輪播效果,說明是js的樣式沒起作用,在程式碼中加入一下程式碼。 wV

Boostrap部落格網站搭建-首頁實現

1、使用輪播圖外掛這裡我們使用swiper.js外掛並附上下載地址:https://pan.baidu.com/s/1c3MifM4   下面就需要新增HTML程式碼了 <div class="jumbotron container-slider"> &