1. 程式人生 > >Android使用ViewPager實現圖片的輪播

Android使用ViewPager實現圖片的輪播

一.概述

在現在的Android專案中,首頁圖片輪播是隨處可見的,今天我們看看如何實現,先看效果圖:

這裡寫圖片描述

二.實現

先給大家看看最簡單的佈局檔案

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <FrameLayout
        android:layout_width
="match_parent" android:layout_height="300dp">
<android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> <RadioGroup android:id
="@+id/group" android:layout_gravity="center_horizontal|bottom" android:layout_width="wrap_content" android:layout_marginBottom="10dp" android:orientation="horizontal" android:layout_height="wrap_content">
</RadioGroup> </FrameLayout
>
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center" > <Button android:id="@+id/start" android:layout_width="wrap_content" android:onClick="click" android:text="開始自動輪播" android:layout_height="wrap_content" /> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:onClick="click" android:text="停止自動輪播" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>

上面一個FrameLayout包裹著一個ViewPager和一個RadioGroup,注意這個RadioGroup我們還沒有為其新增按鈕,因為我們的按鈕的個數是根據圖片個數確定的,我們不知道圖片有多少張,因為實際專案中圖片都是從伺服器獲取來的。最下面是兩個按鈕,用於控制是否自動輪播。

接下來我們看看按鈕的樣式,這裡的按鈕我們使用了ImageView,背景我們使用了選擇器。
當你要為一個圖片設定選擇器作為背景的話,使用下面的程式碼:

 imageview.setImageResource(R.drawable.rg_selector);

我們來看看這個選擇器是如何寫的,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/rb_default"/>
    <item android:state_enabled="true" android:drawable="@drawable/rb_select"/>
</selector>

這裡我們設定了按鈕選中和沒有選中時的樣式,下面我們看看分別是如何定義的:

//選中時樣式rb_default
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    >
    <solid android:color="@android:color/holo_blue_bright"/>
   <size android:height="20dp" android:width="20dp"/>
</shape>
//未選中樣式rb_select
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    >
    <solid android:color="@android:color/white"/>
    <size android:height="20dp" android:width="20dp"/>
</shape>

和xml佈局檔案有關的我們就介紹完了,下面看看java程式碼如何實現:

public class MainActivity extends Activity {
    private ViewPager viewPager;
    private RadioGroup group;
    //圖片資源
    private int[] imageIds = {R.drawable.ym1,R.drawable.ym2,R.drawable.ym3,R.drawable.ym4};
    //存放圖片的陣列
    private List<ImageView> mList;
    //當前索引位置以及上一個索引位置
    private int index = 0,preIndex = 0;
    //是否需要輪播標誌
    private boolean isContinue = true;
    //定時器,用於實現輪播
    private Timer timer;
     Handler mHandler  = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 1:
                    index++;
                    System.out.println("==========index: "+index);
                        viewPager.setCurrentItem(index);
                    }
            }
    };
    private Button btnStart;
    private Button btnStop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        group = (RadioGroup) findViewById(R.id.group);
        mList = new ArrayList<>();
        viewPager.setAdapter(pagerAdapter);
        viewPager.addOnPageChangeListener(onPageChangeListener);
        viewPager.setOnTouchListener(onTouchListener);
        btnStart = (Button) findViewById(R.id.start);
        btnStop = (Button) findViewById(R.id.stop);
        initRadioButton(imageIds.length);
        btnStop.setEnabled(false);
    }
    public void click(View view){
        switch (view.getId()){
            case R.id.start:
                timer = new Timer();//建立Timer物件
                //執行定時任務
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        //首先判斷是否需要輪播,是的話我們才發訊息
                        if (isContinue) {
                            mHandler.sendEmptyMessage(1);
                        }
                    }
                },2000,2000);//延遲2秒,每隔2秒發一次訊息
                btnStart.setEnabled(false);
                btnStop.setEnabled(true);
                break;
            case R.id.stop:
                timer.cancel();
                btnStart.setEnabled(true);
                btnStop.setEnabled(false);
                break;
        }
    }

    /**
     * 根據圖片個數初始化按鈕
     * @param length
     */
    private void initRadioButton(int length) {
        for(int i = 0;i<length;i++){
            ImageView imageview = new ImageView(this);
            imageview.setImageResource(R.drawable.rg_selector);//設定背景選擇器
            imageview.setPadding(20,0,0,0);//設定每個按鈕之間的間距
            //將按鈕依次新增到RadioGroup中
            group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            //預設選中第一個按鈕,因為預設顯示第一張圖片
            group.getChildAt(0).setEnabled(false);
        }
    }

    /**
     * 根據當前觸控事件判斷是否要輪播
     */
    View.OnTouchListener onTouchListener  = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()){
                //手指按下和划動的時候停止圖片的輪播
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_MOVE:
                    isContinue = false;
                    break;
                default:
                    isContinue = true;
            }
            return false;
        }
    };
    /**
     *根據當前選中的頁面設定按鈕的選中
     */
    ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
           index = position;//當前位置賦值給索引
            setCurrentDot(index%imageIds.length);
        }
        @Override
        public void onPageScrollStateChanged(int state) {

        }
    };

    /**
     * 設定對應位置按鈕的狀態
     * @param i 當前位置
     */
    private void setCurrentDot(int i) {
        if(group.getChildAt(i)!=null){
            group.getChildAt(i).setEnabled(false);//當前按鈕選中
        }
        if(group.getChildAt(preIndex)!=null){
            group.getChildAt(preIndex).setEnabled(true);//上一個取消選中
            preIndex = i;//當前位置變為上一個,繼續下次輪播
        }
    }
    PagerAdapter pagerAdapter = new PagerAdapter() {
        @Override
        public int getCount() {
            //返回一個比較大的值,目的是為了實現無限輪播
            return Integer.MAX_VALUE;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            position = position%imageIds.length;
            ImageView imageView = new ImageView(MainActivity.this);
            imageView.setImageResource(imageIds[position]);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            container.addView(imageView);
            mList.add(imageView);
            return imageView;
        }
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(mList.get(position));
        }
    };
}

由於註釋寫的還是比較詳細的,我就不仔細講了,大家有不懂的地方可以給我留言。

相關推薦

iOS開發項目實戰——Swift實現圖片與瀏覽

0.10 上網 timer類 開發項目 cas hub string obj tle 近期開始開發一個新的iOS應用,自己決定使用Swift。進行了幾天之後,發現了一個非常嚴峻的問題。那就是無論是書籍,還是網絡資源,關於Swift的實在是太少了,隨便一

CSS/HTML/JS實現圖片

class fff 瀏覽器 tro back 全局 實現圖 func 原理 實現原理 將點擊的a標簽的href屬性值賦給img標簽的src屬性,這樣有個好處,就是如果瀏覽器不支持js的話,點擊a標簽也可跳轉到圖片地址看到圖片,不會影響內容的呈現 註:需要導入jquery

使用JQuery實現圖片效果

left 簡述 flow href 集合 jpg -i round 輪播 【效果如圖】 【原理簡述】 這裏大概說一下整個流程: 1,將除了第一張以外的圖片全部隱藏, 2,獲取第一張圖片的alt信息顯示在信息欄,並添加點擊事件 3,為4個按鈕添加點擊偵聽,點擊相應的按鈕,用

原生JS實現圖片

讓其 gin 偏移量 adding char 效率 lin doc 動畫效果 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8">

Flexslider插件實現圖片、文字圖片相結合滑動切換效果

remove 12px body 類型 ons art cal 選項 csharp 插件下載:   點擊下載 密碼: fbeg Flexslider具有以下特性: 支持滑動和淡入淡出效果。 支持水平、垂直方向滑動。 支持鍵盤方向鍵控制。 支持觸控滑動。 支

使用Ajax+jQuery來實現前端收到的數據在console上顯示+簡單的主頁設計與bootstrap插件實現圖片

value size 靠譜 實現圖 active length oot function 想要 1.實現前端輸入的數據在console上顯示 上一篇是解決了在前端的輸入信息在cygwin上顯示,這次要給前臺們能看見的數據,因為數據庫裏插入的數據少,所以寫的語句翻來覆去就那幾

C# winform窗體實現圖片

1、定義一個方法設定控制元件 和執行緒時間 /// <summary> /// 改變圖片 /// </summary> /// <param name="img">圖片</param>

微信小程式實現圖片

wxml頁面程式碼: <!--圖片輪播 --> <view class='swipercontainer'> <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" inte

[程式碼] 使用css3實現圖片

使用css3實現圖片輪播 前言:實現圖片輪播的方式有很多種 ,例如js ,css 等等。 本文主要講述使用純css3實現輪播圖 工具介紹: 使用的編輯器: Hbuilder 進入正題 htm

html中使用JS實現圖片效果

HTML 部分 <div id="bannner" class="main_center_bannar">

html+css+js簡單實現圖片效果

<script>  index=0;function show_img(){             imgs=document.getElementById("shidian_img").children; //獲取所以圖片 並且儲存到陣列imgs數組裡             for(i =0

純css3實現圖片

用css3的動畫可以實現圖片輪播 無非就是兩種型別:  左右滾動型別, 漸變型別 1 左右滾動 定義一個大盒子 在一個小盒子裡面 裝3張圖片(這裡用3張圖片為例子) 三張圖片可以向左浮動,大盒子 overflow :hidden 小盒子增加css3

jquery實現圖片圖效果

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> *{ padding:0; margin:0; list-style:n

用原生JS實現 圖片切換 功能

效果如圖:程式碼如下:<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title

viewPager+photoView實現圖片和手勢縮放功能 支援手勢縮放的imageView 如何實現相簿左右滑動和手勢縮放 如何讓圖片自適應控制元件大小 photoView如何使用(上)

import uk.co.senab.photoview.IPhotoView; import uk.co.senab.photoview.PhotoViewAttacher; import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedList

JavaScript實現圖片和滑鼠懸停顯示

例: 提前放好了四張圖片,並編號。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www

JS原生程式碼實現圖片無縫切換的一種思路

JS實現圖片輪播是個老生常談的問題,也是新手的必由之路,在這裡提供一種思路,供大家參考: 1.生成DIV做外框,並設定overflow:hidden;  // 每個方法都必須有的 2.建立一個數組arr,放置圖片地址 3.生成兩個並排的圖片img1,img2,初始化圖片地址

+【CSS3】使用純css程式碼實現圖片效果

 使用純CSS3程式碼實現簡單的圖片輪播。 基本思路: 以5張圖片為例: 1.基本佈局: 將5張圖片左浮動橫向並排放入一個div容器(#photos)內,圖片設定統一尺寸,div寬度設定5個圖片的總尺寸,然後放入相框容器div(#frame),相框設定1個圖片

vue.js中使用swiper外掛實現圖片

第一步:安裝swiper:npm install [email protected] --save-dev 完成之後,你會在專案的node_modules資料夾中多一個swiper資料夾。 第二步:引用元件 import Swiper from 'swiper

改變opacity實現圖片

這裡實現原理我就不詳細述說了,主要是通過改變圖片的opacity,利用fadeIn和fadeOut來實現過渡效果,使切換不會顯得很突兀。 但是我在這裡遇到了一個問題,讓我糾結了一段時間。問題是,我發現頁面初始化的時候首屏切換並沒有過渡效果,僅僅是直接切換了。我想了很久,以為