package com.mfh.comna.view.img;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
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.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.mfh.comna.R;
/**
* -----------------------------------------------------------------
*
* Copyright (C) 2014 ChunChen
*
* AutoSlideViewPager
*
* @version: v1.0.0
*
* @author: Caij
*
* Create Date: 2014.08.22
*
* -----------------------------------------------------------------
*/
public class AutoSlideViewPager extends RelativeLayout implements OnPageChangeListener {
private static final int WHAT = 1;
private Context context;
private ViewPager mViewPager;
/** Describe the title of the current page */
private TextView mDescriptionTextView;
/** Point layout of the current page*/
private LinearLayout mPointLinearLayout;
/**Whether automatic scroll*/
private boolean isAuto = false;
private int mIntervalTime;
/** whether stop auto scroll when touching, default is true **/
private boolean stopScrollWhenTouch = true;
private boolean isStopByTouch = false;
private Handler mHandler;
/**point image resource id*/
private int mNormalPointImageResid;
private int mSelectPointImageResid;
private boolean isShowPoint = true;
/**previous page index*/
private int mPreviousItem = 0;
public AutoSlideViewPager(Context context) {
super(context);
this.context = context;
initView();
}
public AutoSlideViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initView();
}
private void initView() {
View.inflate(context, R.layout.auto_scroll_viewpage, this);
mViewPager = (ViewPager) this.findViewById(R.id.item_viewpage);
mDescriptionTextView = (TextView) this.findViewById(R.id.item_tv_desc);
mPointLinearLayout = (LinearLayout) this.findViewById(R.id.item_llayout_point);
mNormalPointImageResid = R.drawable.dot_normal;
mSelectPointImageResid = R.drawable.dot_focus;
mViewPager.setOnPageChangeListener(this);
}
public void setAdapter(PagerAdapter adapter) {
mViewPager.setAdapter(adapter);
if (isShowPoint) {
mPointLinearLayout.removeAllViews();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);
for(int i = 0; i < adapter.getCount(); i++) {
ImageView pointImage = new ImageView(context);
int resId = 0==i ? mSelectPointImageResid : mNormalPointImageResid;
pointImage.setLayoutParams(params);
pointImage.setBackgroundResource(resId);
mPointLinearLayout.addView(pointImage);
}
}
}
/**
* point image resource id
* @param normal
* @param select
*/
public void setPointImageResId(int normal, int select) {
this.mNormalPointImageResid = normal;
this.mSelectPointImageResid = select;
}
/**
* Set title of the current page
* @param description
*/
public void setDesctiption(String description) {
mDescriptionTextView.setText(description);
}
/**
* start auto slide
* @param intervalTime slide interval time
*/
public void startSlide(int intervalTime) {
isAuto = true;
this.mIntervalTime = intervalTime;
if (mHandler == null) {
mHandler = new MHandler();
}
mHandler.removeMessages(WHAT);
mHandler.sendEmptyMessageDelayed(WHAT, mIntervalTime);
}
/**
* stop auto slide
* Suggest to destroy at the interface between the time to stop
*/
public void stopSlide() {
isAuto = false;
if (mHandler != null) {
mHandler.removeMessages(WHAT);
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (stopScrollWhenTouch) {
if (ev.getAction() == MotionEvent.ACTION_DOWN && isAuto) {
isStopByTouch = true;
stopSlide();
}
else if (ev.getAction() == MotionEvent.ACTION_UP && isStopByTouch) {
startSlide(mIntervalTime);
}
}
return super.dispatchTouchEvent(ev);
}
/**
* set whether stop auto scroll when touching, default is true
*
* @param stopScrollWhenTouch
*/
public void setStopScrollWhenTouch(boolean stopScrollWhenTouch) {
this.stopScrollWhenTouch = stopScrollWhenTouch;
}
public void setCurrentItem(int item) {
mViewPager.setCurrentItem(item);
}
public int getCurrentItem() {
return mViewPager.getCurrentItem();
}
public void setShowPoint(boolean isShowPoint) {
this.isShowPoint = isShowPoint;
}
private void nextPage() {
if (getCurrentItem() == mPointLinearLayout.getChildCount() - 1) {
setCurrentItem(0);
}
else {
setCurrentItem(getCurrentItem() + 1);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onPageScrolled(int i, float v, int j) {
}
@Override
public void onPageSelected(int arg0) {
if (isShowPoint) {
changePointImageState(arg0, true);
changePointImageState(mPreviousItem, false);
mPreviousItem = arg0;
}
}
private void changePointImageState(int index, boolean isSelect) {
ImageView poiImageView = (ImageView) mPointLinearLayout.getChildAt(index);
int resId = isSelect ? mSelectPointImageResid : mNormalPointImageResid;
poiImageView.setBackgroundResource(resId);
}
@SuppressLint("HandlerLeak")
private class MHandler extends Handler{
@Override
public void handleMessage(Message msg) {
if (isAuto) {
nextPage();
mHandler.sendEmptyMessageDelayed(WHAT, mIntervalTime);
}
}
}
}