android中ViewPager+Picasso 實現輪播本地和網絡圖片源碼

一、原理
首先,將這些要輪播的圖片和一些文本分別放置在不同的數據集合中,程序啓動的時候默認顯示一組圖片和文本數據,然後啓動一個定時器,每隔一段時間便替換掉顯示的圖片和文本數據,同時加入一些動畫效果,已達到輪播的特效。同時,我們也要實現手指滑動圖片達到輪播的效果。

二、實現
1、程序啓動界面MainActivity

我將所有的實現都放在了MainActivity中,下面我們就來分解來看這個類。

1)成員變量

這些成員變量包括界面上顯示的控件,存放圖片的id數組,存放圖片的標題數組,自定義的ViewPagerAdapter適配器,線程池ScheduledExecutorService

具體代碼如下:

private ViewPager mViewPaper;
private List<ImageView> images;
private List<View> dots;
private int currentItem;
//記錄上一次點的位置
private int oldPosition = 0;
private ScheduledExecutorService scheduledExecutorService;
private ViewPagerAdapter adapter;

private TextView title;

//存放圖片的id
private int[] imageIds = new int[]{
R.drawable.ads_one,
R.drawable.ads_two,
R.drawable.ads_three
};
//存放圖片的id
private String[] imageTitle = new String[]{
"測試圖片1",
"測試圖片2",
"測試圖片3"
};

2)onCreate方法

這個方法是程序啓動創建界面時的回調方法,這個方法中主要實現的功能就是初始化界面,同時爲ViewPager設置頁面變化監聽事件。

具體實現代碼如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
title = (TextView)findViewById(R.id.title);
title.setText(imageTitle[0]);
mViewPaper = (ViewPager) findViewById(R.id.vp);
mViewPaper.setFocusable(true);
mViewPaper.setFocusableInTouchMode(true);
mViewPaper.requestFocus();
//顯示的圖片
images = new ArrayList<ImageView>();
for (int i = 0; i < imageIds.length; i++) {

ImageView imageView = new ImageView(this);
//獲取本地圖片
//imageView.setBackgroundResource(imageIds[i]);
//獲取網絡圖片
//百度首頁的網絡圖片
//https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png
Picasso.with(this).load("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png").into(imageView);
images.add(imageView);
}
//顯示的小點
dots = new ArrayList<View>();
dots.add(findViewById(R.id.dot_0));
dots.add(findViewById(R.id.dot_1));
dots.add(findViewById(R.id.dot_2));
/* dots.add(getView().findViewById(R.id.dot_3));
dots.add(getView().findViewById(R.id.dot_4));*/

adapter = new ViewPagerAdapter();
mViewPaper.setAdapter(adapter);

mViewPaper.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {


@Override
public void onPageSelected(int position) {

title.setText(imageTitle[position]);

dots.get(position).setBackgroundResource(R.drawable.dot_focused);
dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);

oldPosition = position;
currentItem = position;
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override
public void onPageScrollStateChanged(int arg0) {

}
});

}
3)自定義Adapter類ViewPagerAdapter

這個自定義的Adapter類不同於以往的自定義Adapter類,它繼承自PagerAdapter,PagerAdapter中實現了圖片切換的動畫效果

將具體實現代碼如下:

/**
* 自定義Adapter
*
* @author BettyLi
*/
private class ViewPagerAdapter extends PagerAdapter {

@Override
public int getCount() {
return images.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

@Override
public void destroyItem(ViewGroup view, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
// view.removeView(view.getChildAt(position));
// view.removeViewAt(position);
view.removeView(images.get(position));
}

@Override
public Object instantiateItem(ViewGroup view, int position) {
// TODO Auto-generated method stub
view.addView(images.get(position));
return images.get(position);
}

}

4)onStart()方法

這個方法是界面創建完成,啓動時的回調方法,我在這個方法中完成的操作是,創建線程池啓動定時調度任務,調用自定義的線程任務,實現定時實現圖片輪播效果。

具體實現代碼如下:

@Override
protected void onStart() {
super.onStart();
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(
new ViewPageTask(),
5,
5,
TimeUnit.SECONDS);
}

5)圖片輪播任務ViewPageTask

這個類實現了Runnable接口,在run方法中實現了圖片輪播的顯示效果,並通過handler通知UI線程,UI線程更新界面顯示,這裏我們不需要傳遞任何數據,所以通過handler發送空消息即可。
具體實現代碼如下:

private class ViewPageTask implements Runnable {
@Override
public void run() {
currentItem = (currentItem + 1) % imageIds.length;
mHandler.sendEmptyMessage(0);
}
}

6)handler

接收ViewPageTask消息完成UI更新操作

具體實現代碼如下:

/**
* 接收子線程傳遞過來的數據
*/
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
mViewPaper.setCurrentItem(currentItem);
}
};
7)onStop

我在這個方法中主要實現的操作就是停止線程池的執行,釋放線程池資源。

具體代碼如下:

@Override
public void onStop() {
super.onStop();
if(scheduledExecutorService != null){
scheduledExecutorService.shutdown();
scheduledExecutorService = null;
}
}

8)MainActivity完整代碼如下:

package com.ljm.viewpager;

import android.app.Activity;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class MainActivity extends Activity {

private ViewPager mViewPaper;
private List<ImageView> images;
private List<View> dots;
private int currentItem;
//記錄上一次點的位置
private int oldPosition = 0;
private ScheduledExecutorService scheduledExecutorService;
private ViewPagerAdapter adapter;

private TextView title;

//存放圖片的id
private int[] imageIds = new int[]{
R.drawable.ads_one,
R.drawable.ads_two,
R.drawable.ads_three
};
//存放圖片的id
private String[] imageTitle = new String[]{
"測試圖片1",
"測試圖片2",
"測試圖片3"
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
title = (TextView)findViewById(R.id.title);
title.setText(imageTitle[0]);
mViewPaper = (ViewPager) findViewById(R.id.vp);
mViewPaper.setFocusable(true);
mViewPaper.setFocusableInTouchMode(true);
mViewPaper.requestFocus();
//顯示的圖片
images = new ArrayList<ImageView>();
for (int i = 0; i < imageIds.length; i++) {

ImageView imageView = new ImageView(this);
//獲取本地圖片
//imageView.setBackgroundResource(imageIds[i]);
//獲取網絡圖片
//百度首頁的網絡圖片
//https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png
Picasso.with(this).load("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png").into(imageView);
images.add(imageView);
}
//顯示的小點
dots = new ArrayList<View>();
dots.add(findViewById(R.id.dot_0));
dots.add(findViewById(R.id.dot_1));
dots.add(findViewById(R.id.dot_2));
/* dots.add(getView().findViewById(R.id.dot_3));
dots.add(getView().findViewById(R.id.dot_4));*/

adapter = new ViewPagerAdapter();
mViewPaper.setAdapter(adapter);

mViewPaper.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {


@Override
public void onPageSelected(int position) {

title.setText(imageTitle[position]);

dots.get(position).setBackgroundResource(R.drawable.dot_focused);
dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);

oldPosition = position;
currentItem = position;
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override
public void onPageScrollStateChanged(int arg0) {

}
});

}



/**
* 自定義Adapter
*
* @author BettyLi
*/
private class ViewPagerAdapter extends PagerAdapter {

@Override
public int getCount() {
return images.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

@Override
public void destroyItem(ViewGroup view, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
// view.removeView(view.getChildAt(position));
// view.removeViewAt(position);
view.removeView(images.get(position));
}

@Override
public Object instantiateItem(ViewGroup view, int position) {
// TODO Auto-generated method stub
view.addView(images.get(position));
return images.get(position);
}

}

@Override
protected void onResume() {
super.onResume();
}

@Override
protected void onStart() {
super.onStart();
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(
new ViewPageTask(),
5,
5,
TimeUnit.SECONDS);
}
private class ViewPageTask implements Runnable {
@Override
public void run() {
currentItem = (currentItem + 1) % imageIds.length;
mHandler.sendEmptyMessage(0);
}
}
/**
* 接收子線程傳遞過來的數據
*/
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
mViewPaper.setCurrentItem(currentItem);
}
};

@Override
public void onStop() {
super.onStop();
if(scheduledExecutorService != null){
scheduledExecutorService.shutdown();
scheduledExecutorService = null;
}
}
}



佈局activity_main.xml

compile 'com.squareup.picasso:picasso:2.5.2'


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ljm.viewpager.MainActivity"
android:orientation="vertical"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="200dp" >

<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="35dip"
android:layout_gravity="bottom"
android:background="#33000000"
android:gravity="center"
android:orientation="vertical" >

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
/>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dip"
android:orientation="horizontal" >

<View
android:id="@+id/dot_0"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_focused"/>

<View
android:id="@+id/dot_1"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_2"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>
<!-- <View
android:id="@+id/dot_3"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_4"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>-->
</LinearLayout>
</LinearLayout>
</LinearLayout>



build.gradle中添加依賴

compile 'com.squareup.picasso:picasso:2.5.2'


AndroidManifest.xml文件


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ljm.viewpager">

<uses-permission android:name="android.permission.INTERNET"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章