package org.aisen.weibo.sina.ui.widget;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.RelativeLayout;
import org.aisen.weibo.sina.R;
public class WallpaperViewer extends RelativeLayout {
public static final float INN_WIDTH_PERCENTS = 0.5f;
private boolean isDispatch;
private float mDownX, mMovePercents;
private int mInnViewPositionX, mInnCenterPositionX;
private View mInnerView;
private WallpaperViewerLisenter mWallpaperViewerLisenter;
private ObjectAnimator mAnimator;
public static interface WallpaperViewerLisenter {
/**
* 当滑动缩略图的时候出发
*
* @param percent 滑动的百分比,负的时候为向左,正的时候为向右
*/
public void onWallpaperViewerScroll(float percent);
}
public WallpaperViewer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public WallpaperViewer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WallpaperViewer(Context context) {
super(context);
}
public void setWallpaperViewerLisenter(WallpaperViewerLisenter wallpaperViewerLisenter) {
this.mWallpaperViewerLisenter = wallpaperViewerLisenter;
}
public void init() {
setBackgroundResource(R.drawable.wallpaper_viewer_bg);
getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(this);
// 初始化 innerView
mInnerView = new View(getContext());
mInnerView.setLayoutParams(new LayoutParams((int) (getWidth() * INN_WIDTH_PERCENTS),
LayoutParams.MATCH_PARENT));
mInnerView.setBackgroundResource(R.drawable.wallpaper_viewer_inn_bg);
mInnCenterPositionX = (int) (getWidth() * (1 - INN_WIDTH_PERCENTS) / 2);
setInnViewPositionX(mInnCenterPositionX);
addView(mInnerView);
return true;
}
});
}
public void setInnViewPositionX(int x) {
if (mInnViewPositionX == x) {
return;
}
mInnerView.setX(x);
mInnViewPositionX = (int) x;
if (mWallpaperViewerLisenter != null) {
float percent = ((float) x - mInnCenterPositionX) / ((float) mInnCenterPositionX);
// 粗力度化防止抖动
percent = ((float) ((int) (percent * 50)) / 50);
if (mMovePercents != percent) {
mMovePercents = percent;
mWallpaperViewerLisenter.onWallpaperViewerScroll(percent);
}
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getVisibility() != View.VISIBLE) {
if (isDispatch) {
return true;
}
return super.dispatchTouchEvent(ev);
}
float downX = ev.getX();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = downX;
if (mAnimator != null && mAnimator.isRunning()) {
mAnimator.end();
}
isDispatch = true;
break;
case MotionEvent.ACTION_MOVE:
int distance = (int) (downX - mDownX);
if (distance < -mInnCenterPositionX) {
distance = -mInnCenterPositionX;
} else if (distance > mInnCenterPositionX) {
distance = mInnCenterPositionX;
}
setInnViewPositionX(distance + mInnCenterPositionX);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (mInnViewPositionX != mInnCenterPositionX) {
// 滑动结束动画
doEndAnim();
}
isDispatch = false;
break;
default:
break;
}
if (isDispatch) {
return true;
}
return super.dispatchTouchEvent(ev);
}
public void doEndAnim() {
mAnimator = ObjectAnimator.ofInt(this, "InnViewPositionX", mInnViewPositionX, mInnCenterPositionX);
mAnimator.setDuration(250);
mAnimator.start();
}
}