增加轮播插件,基于ViewPager实现,借助第三方voelly组件实现

This commit is contained in:
zengfantian 2014-12-08 13:45:27 +08:00
parent a8ea453397
commit a725be0c91
15 changed files with 841 additions and 0 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

View File

@ -0,0 +1,8 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/view_imageindicator_arrow_left_focus" android:state_pressed="true"/>
<item android:drawable="@drawable/view_imageindicator_arrow_left_focus" android:state_selected="true"/>
<item android:drawable="@drawable/view_imageindicator_arrow_left_focus" android:state_focused="true"/>
<item android:drawable="@drawable/view_imageindicator_arrow_left"/>
</selector>

View File

@ -0,0 +1,8 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/view_imageindicator_arrow_right_focus" android:state_pressed="true"/>
<item android:drawable="@drawable/view_imageindicator_arrow_right_focus" android:state_selected="true"/>
<item android:drawable="@drawable/view_imageindicator_arrow_right_focus" android:state_focused="true"/>
<item android:drawable="@drawable/view_imageindicator_arrow_right"/>
</selector>

View File

@ -0,0 +1,53 @@
<?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/view_pager"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:gravity="bottom" >
<Button
android:id="@+id/left_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/view_imageindicator_arrow_left_selector" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:gravity="bottom" >
<Button
android:id="@+id/right_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/view_imageindicator_arrow_right_selector" />
</LinearLayout>
<LinearLayout
android:id="@+id/indicater_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:gravity="center"
android:minHeight="10dp"
android:minWidth="60dp"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>

View File

@ -8,6 +8,10 @@ import android.app.Activity;
import android.app.Application;
import android.content.Context;
import com.android.http.RequestManager;
import com.android.volley.toolbox.ImageLoader;
import com.zftlive.android.view.imageindicator.NetworkImageCache;
/**
* 整个应用程序Applicaiton
*
@ -27,8 +31,22 @@ public class MApplication extends Application {
public void onCreate() {
super.onCreate();
instance = this;
//初始化请求队列
RequestManager.getInstance().init(MApplication.this);
sImageLoader = new ImageLoader(RequestManager.getInstance()
.getRequestQueue(), imageCacheMap);
}
private static ImageLoader sImageLoader = null;
private final NetworkImageCache imageCacheMap = new NetworkImageCache();
public static ImageLoader getImageLoader() {
return sImageLoader;
}
private static Map<String, Object> data = new HashMap<String, Object>();
public static void assignData(String strKey, Object strValue) {

View File

@ -0,0 +1,182 @@
package com.zftlive.android.view.imageindicator;
import android.os.Handler;
import android.os.Message;
import com.zftlive.android.view.imageindicator.ImageIndicatorView;
/**
* Auto BrocastManager for ImageIndicatorView
*
* @author steven-pan
*
*/
public class AutoPlayManager {
/**
* 自动播放标志位默认播放
*/
private boolean broadcastEnable = false;
/**
* 自动播放启动默认时间
*/
private static final long DEFAULT_STARTMILS = 2 * 1000;
/**
* 自动播放间隔默认时间
*/
private static final long DEFAULT_INTEVALMILS = 3 * 1000;
/**
* 启动时间ms
*/
private long startMils = DEFAULT_STARTMILS;
/**
* 间隔ms
*/
private long intevalMils = DEFAULT_INTEVALMILS;
/**
* 向右
*/
private final static int RIGHT = 0;
/**
* 向左
*/
private final static int LEFT = 1;
/**
* 当前方向
*/
private int direction = RIGHT;
/**
* 自动播放默认次数无限
*/
private static final int DEFAULT_TIMES = -1;
/**
* 自动播放次数
*/
private int broadcastTimes = DEFAULT_TIMES;
/**
* 自动播放次数记数
*/
private int timesCount = 0;
/**
* 循环播放
*/
private Handler broadcastHandler = null;
/**
* target ImageIndicatorView
*/
private ImageIndicatorView mImageIndicatorView = null;
public AutoPlayManager(ImageIndicatorView imageIndicatorView) {
this.mImageIndicatorView = imageIndicatorView;
this.broadcastHandler = new BroadcastHandler(AutoPlayManager.this);
}
/**
* 设置自动播放启动时间和间隔
*
* @param startMils
* 启动时间ms(>2, 默认为8s)
* @param intevelMils
* 间隔ms(默认为3s)
*/
public void setBroadcastTimeIntevel(long startMils, long intevelMils) {
this.startMils = startMils;
this.intevalMils = intevelMils;
}
/**
* 设置自动播放开关
*
* @param flag
* 打开或关闭
*/
public void setBroadcastEnable(boolean flag) {
this.broadcastEnable = flag;
}
/**
* 设置循环播放次数
*
* @param times
* 循环播放次数
*/
public void setBroadCastTimes(int times) {
this.broadcastTimes = times;
}
/**
* 启动循环播放
*/
public void loop() {
if (broadcastEnable) {
broadcastHandler.sendEmptyMessageDelayed(0, this.startMils);
}
}
protected void handleMessage(android.os.Message msg) {
if (broadcastEnable) {
if (System.currentTimeMillis()
- mImageIndicatorView.getRefreshTime() < 2 * 1000) {// 最近一次划动间隔小于2s
return;
}
if ((broadcastTimes != DEFAULT_TIMES)
&& (timesCount > broadcastTimes)) {// 循环次数用完
return;
}
if (direction == RIGHT) {// roll right
if (mImageIndicatorView.getCurrentIndex() < mImageIndicatorView
.getTotalCount()) {
if (mImageIndicatorView.getCurrentIndex() == mImageIndicatorView
.getTotalCount() - 1) {
timesCount++;// 循环次数次数加1
direction = LEFT;
} else {
mImageIndicatorView
.getViewPager()
.setCurrentItem(
mImageIndicatorView.getCurrentIndex() + 1,
true);
}
}
} else {// roll left
if (mImageIndicatorView.getCurrentIndex() >= 0) {
if (mImageIndicatorView.getCurrentIndex() == 0) {
direction = RIGHT;
} else {
mImageIndicatorView
.getViewPager()
.setCurrentItem(
mImageIndicatorView.getCurrentIndex() - 1,
true);
}
}
}
broadcastHandler.sendEmptyMessageDelayed(1, this.intevalMils);
}
}
static class BroadcastHandler extends Handler {
private AutoPlayManager autoBrocastManager;
public BroadcastHandler(AutoPlayManager autoBrocastManager) {
this.autoBrocastManager = autoBrocastManager;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (this.autoBrocastManager != null) {
autoBrocastManager.handleMessage(msg);
}
}
}
}

View File

@ -0,0 +1,460 @@
package com.zftlive.android.view.imageindicator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.zftlive.android.R;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
/**
* 用户指引,宣传画控件(类似于Gallery效果)
*
* @author savant-pan
*
*/
public class ImageIndicatorView extends RelativeLayout {
/**
* ViewPager控件
*/
private ViewPager viewPager;
/**
* 指示器容器
*/
private LinearLayout indicateLayout;
/**
* 向左划箭头
*/
private Button leftButton;
/**
* 向右划箭头
*/
private Button rightButton;
/**
* 页面列表
*/
private List<View> viewList = new ArrayList<View>();
private Handler refreshHandler;
/**
* 滑动位置通知回调监听对象
*/
private OnItemChangeListener onItemChangeListener;
/**
* 单个界面点击回调监听对象
*/
private OnItemClickListener onItemClickListener;
/**
* 总页面条数
*/
private int totelCount = 0;
/**
* 当前页索引
*/
private int currentIndex = 0;
/**
* 圆形列表+箭头提示器
*/
public static final int INDICATE_ARROW_ROUND_STYLE = 0;
/**
* 操作导引提示器
*/
public static final int INDICATE_USERGUIDE_STYLE = 1;
/**
* INDICATOR样式
*/
private int indicatorStyle = INDICATE_ARROW_ROUND_STYLE;
/**
* 最近一次划动时间
*/
private long refreshTime = 0l;
/**
* 广告位置监听接口
*/
public interface OnItemChangeListener {
void onPosition(int position, int totalCount);
}
/**
* 条目点击事件监听接口
*/
public interface OnItemClickListener {
void OnItemClick(View view, int position);
}
public ImageIndicatorView(Context context, AttributeSet attrs) {
super(context, attrs);
this.init(context);
}
public ImageIndicatorView(Context context) {
super(context);
this.init(context);
}
/**
* @param context
*/
private void init(Context context) {
LayoutInflater.from(context).inflate(R.layout.view_imageindicator_layout, this);
this.viewPager = (ViewPager) findViewById(R.id.view_pager);
this.indicateLayout = (LinearLayout) findViewById(R.id.indicater_layout);
this.leftButton = (Button) findViewById(R.id.left_button);
this.rightButton = (Button) findViewById(R.id.right_button);
this.leftButton.setVisibility(View.GONE);
this.rightButton.setVisibility(View.GONE);
this.viewPager.setOnPageChangeListener(new PageChangeListener());
final ArrowClickListener arrowClickListener = new ArrowClickListener();
this.leftButton.setOnClickListener(arrowClickListener);
this.rightButton.setOnClickListener(arrowClickListener);
this.refreshHandler = new ScrollIndicateHandler(ImageIndicatorView.this);
}
/**
* 取ViewPager实例
*
* @return
*/
public ViewPager getViewPager() {
return viewPager;
}
/**
* 取当前位置Index值
*/
public int getCurrentIndex() {
return this.currentIndex;
}
/**
* 取总VIEW数目
*/
public int getTotalCount() {
return this.totelCount;
}
/**
* 取最近一次刷新时间
*/
public long getRefreshTime() {
return this.refreshTime;
}
/**
* 添加单个View
*
* @param view
*/
public void addViewItem(View view) {
final int position = viewList.size();
view.setOnClickListener(new ItemClickListener(position));
this.viewList.add(view);
}
/**
* 条目点击事件监听类
*/
private class ItemClickListener implements View.OnClickListener {
private int position = 0;
public ItemClickListener(int position) {
this.position = position;
}
@Override
public void onClick(View view) {
if (onItemClickListener != null) {
onItemClickListener.OnItemClick(view, position);
}
}
}
/**
* 设置显示图片Drawable数组
*
* @param resArray
* Drawable数组
*/
public void setupLayoutByDrawable(final Integer resArray[]) {
if (resArray == null)
throw new NullPointerException();
this.setupLayoutByDrawable(Arrays.asList(resArray));
}
/**
* 设置显示图片Drawable列表
*
* @param resList
* Drawable列表
*/
public void setupLayoutByDrawable(final List<Integer> resList) {
if (resList == null)
throw new NullPointerException();
final int len = resList.size();
if (len > 0) {
for (int index = 0; index < len; index++) {
final View pageItem = new ImageView(getContext());
pageItem.setBackgroundResource(resList.get(index));
addViewItem(pageItem);
}
}
}
/**
* 设置当前显示项
*
* @param index
* postion
*/
public void setCurrentItem(int index) {
this.currentIndex = index;
}
/**
* 设置指示器样式默认为INDICATOR_ARROW_ROUND_STYLE
*
* @param style
* INDICATOR_USERGUIDE_STYLE或INDICATOR_ARROW_ROUND_STYLE
*/
public void setIndicateStyle(int style) {
this.indicatorStyle = style;
}
/**
* 添加位置监听回调
*
* @param onGuideListener
*/
public void setOnItemChangeListener(OnItemChangeListener onItemChangeListener) {
if (onItemChangeListener == null) {
throw new NullPointerException();
}
this.onItemChangeListener = onItemChangeListener;
}
/**
* 设置条目点击监听对象
*
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
/**
* 显示
*/
public void show() {
this.totelCount = viewList.size();
final LayoutParams params = (LayoutParams) indicateLayout.getLayoutParams();
if (INDICATE_USERGUIDE_STYLE == this.indicatorStyle) {// 操作指引
params.bottomMargin = 45;
}
this.indicateLayout.setLayoutParams(params);
// 初始化指示器
for (int index = 0; index < this.totelCount; index++) {
final View indicater = new ImageView(getContext());
this.indicateLayout.addView(indicater, index);
}
this.refreshHandler.sendEmptyMessage(currentIndex);
// 为ViewPager配置数据
this.viewPager.setAdapter(new MyPagerAdapter(this.viewList));
this.viewPager.setCurrentItem(currentIndex, false);
}
/**
* 箭头点击事件处理
*/
private class ArrowClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
if (view == leftButton) {
if (currentIndex >= (totelCount - 1)) {
return;
} else {
viewPager.setCurrentItem(currentIndex + 1, true);
}
} else {
if (totelCount <= 0) {
return;
} else {
viewPager.setCurrentItem(currentIndex - 1, true);
}
}
}
}
/**
* 页面变更监听
*/
private class PageChangeListener implements OnPageChangeListener {
@Override
public void onPageSelected(int index) {
currentIndex = index;
refreshHandler.sendEmptyMessage(index);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
}
/**
* 刷新提示器
*/
protected void refreshIndicateView() {
this.refreshTime = System.currentTimeMillis();
for (int index = 0; index < totelCount; index++) {
final ImageView imageView = (ImageView) this.indicateLayout.getChildAt(index);
if (this.currentIndex == index) {
imageView.setBackgroundResource(R.drawable.view_imageindicator_image_indicator_focus);
} else {
imageView.setBackgroundResource(R.drawable.view_imageindicator_image_indicator);
}
}
if (INDICATE_USERGUIDE_STYLE == this.indicatorStyle) {// 操作指引不显示箭头
this.leftButton.setVisibility(View.GONE);
this.rightButton.setVisibility(View.GONE);
} else {// 显示箭头各状态
if (totelCount <= 1) {
leftButton.setVisibility(View.GONE);
rightButton.setVisibility(View.GONE);
} else if (totelCount == 2) {
if (currentIndex == 0) {
leftButton.setVisibility(View.VISIBLE);
rightButton.setVisibility(View.GONE);
} else {
leftButton.setVisibility(View.GONE);
rightButton.setVisibility(View.VISIBLE);
}
} else {
if (currentIndex == 0) {
leftButton.setVisibility(View.VISIBLE);
rightButton.setVisibility(View.GONE);
} else if (currentIndex == (totelCount - 1)) {
leftButton.setVisibility(View.GONE);
rightButton.setVisibility(View.VISIBLE);
} else {
leftButton.setVisibility(View.VISIBLE);
rightButton.setVisibility(View.VISIBLE);
}
}
}
if (this.onItemChangeListener != null) {// 页面改更了
try {
this.onItemChangeListener.onPosition(this.currentIndex, this.totelCount);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class MyPagerAdapter extends PagerAdapter {
private List<View> pageViews = new ArrayList<View>();
public MyPagerAdapter(List<View> pageViews) {
this.pageViews = pageViews;
}
@Override
public int getCount() {
return pageViews.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(pageViews.get(arg1));
}
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(pageViews.get(arg1));
return pageViews.get(arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
}
class ScrollIndicateHandler extends Handler {
private ImageIndicatorView scrollIndicateView;
public ScrollIndicateHandler(ImageIndicatorView scrollIndicateView) {
this.scrollIndicateView = scrollIndicateView;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (this.scrollIndicateView != null) {
scrollIndicateView.refreshIndicateView();
}
}
}

View File

@ -0,0 +1,44 @@
package com.zftlive.android.view.imageindicator;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
/**
* @description NetworkImageCache
*
* @auther steven-pan
*/
public class NetworkImageCache extends LruCache<String, Bitmap> implements
ImageCache {
public NetworkImageCache() {
this(getDefaultLruCacheSize());
}
public NetworkImageCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
}

View File

@ -0,0 +1,68 @@
package com.zftlive.android.view.imageindicator;
import java.util.List;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView.ScaleType;
import com.android.http.WebImageView;
import com.zftlive.android.MApplication;
import com.zftlive.android.R;
import com.zftlive.android.tools.ToolResource;
/**
* Network ImageIndicatorView, by urls
*
* @author steven-pan
*
*/
public class NetworkImageIndicatorView extends ImageIndicatorView {
/**默认资源图片ID**/
private int default_image = -1;
public NetworkImageIndicatorView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NetworkImageIndicatorView(Context context) {
super(context);
}
/**
* 设置显示图片URL列表
*
* @param urlList
* URL列表
*/
public void setupLayoutByImageUrl(final List<String> urlList) {
if (urlList == null)
throw new NullPointerException();
final int len = urlList.size();
if (len > 0) {
for (int index = 0; index < len; index++) {
final WebImageView pageItem = new WebImageView(getContext());
pageItem.setScaleType(ScaleType.FIT_XY);
if(-1 != default_image){
pageItem.setDefaultImageResId(default_image);
}else{
pageItem.setDefaultImageResId(ToolResource.getDrawableId("ic_launcher"));
}
pageItem.setImageUrl(urlList.get(index),
MApplication.getImageLoader());
addViewItem(pageItem);
}
}
}
/**
* 设置默认图片
* @param resId 默认图片资源ID
*/
public void setDefaultImage(int resId){
this.default_image = resId;
}
}