1. 程式人生 > >安卓輪播圖的實現(自定義view)

安卓輪播圖的實現(自定義view)

/*******************************************************
 * @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

/******************************************************* * @author: wukai * * * * * * @date: 2017/10/12 *

,無限動輪,可手動滑動+點選事件

                                          &nb

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

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

bootstrap 實現大小適應

</div><a class="left carousel-control" style="background-color: rgba(255,255,255,0);opacity:0" href="#myCarousel" role="button" data-slide="prev"&

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

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

簡單3淡入淡出

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

react-native-page-scrollview 的使用方法(實現酷炫的分頁效果,還支援定義View)

react-native-page-scrollview 對ScrollView的封裝,可以很方便的實現水平,垂直分頁輪播效果.而且可以自定義分頁寬高,和側邊View的旋轉,透明度,大小等. 對於原生的ScrollView只支援水平的整屏的分頁,而且我看gi

【vue 元件 mint-ui】 看了一下原始碼,給Swiper封裝定義跳轉的函式

mint-ui 自身提供了前一頁,後一頁的function,這裡由於專案需求,點選任意tab都可跳轉到相應的圖片,所以自己封裝了一個function:switchCar。 Usage import Mint from ‘mint-ui’;

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柱狀定義view

  public class HistogramView extends View { private Paint mLinePaint; private Paint mGreenPaint; private Paint mTextPaint;

一步一步教你寫股票走勢——分時定義標記

分時圖開發到現在,基本已經完成了,這部分開發完,就會開始著手k線圖部分的開發。於是我們做了最後的對比,看下還有什麼地方需要增加修改,最後發現,還有標記檢視沒有,先看下什麼是標記檢視(博主不知道這個名字叫啥,自己起的): 我們可以看到高亮

android圖片快取實現定義ImageLoader

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; import android.graphics.Bitmap; import

水波紋定義View

自定義控制元件: public class WaveView extends View { private static final String TAG = "WaveView"; private float fai = 0; private P

android正在載入效果定義view

好久沒有寫部落格了,最近實習的公司在趕專案,現在比較清閒,趁現在寫寫部落格,總結一下自己在實習的時候學到的知識(然而這個demo並不是公司學到的,並沒有什麼卵用),先上效果圖吧,這個實現還是比較簡單的,當時做這個的想法是因為某客學院的正在載入的效果還不錯,所以嘗

最簡單的實現無限

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

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實

Axure學習筆記-製作包括動輪播及點選

覺得下面這個分享挺好,我就不重複做了。 如何製作輪播圖: (1)實現圖片輪播; (2)將圓點與輪播圖片一一對應; (3)實現前一張、後一張圖片切換。 1、所需元件 首先我們需要準備以下元件: 動態面板(1000*400)、圓(3個,15*15)、

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

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

Axure學習筆記整理2-Banner製作包括動輪播及手動輪

覺得下面這個分享挺好,我就不重複做了。 另外,我在原文中添加了一個小點,關於輪播導致的圓點顏色變化的設定。請看第3章第2部分的紅色字型。   謝謝原作者的分享。以下為原文連結。 轉載至:https://www.jianshu.com/p/628a22c1f653 &nb