话不多说,直接上效果图
imagereview.gif
1、要实现效果图的方案,需要操作重写ViewPager的事件处理。
2、下滑透明的方案可以使用设置背景来实现
下拉缩放的效果需要重写onInterceptTouchEvent和onTouchEvent,
在onInterceptTouchEvent中不拦截down事件,并且在move事件中判断是否满足下滑缩放的条件;
在onTouchEvent中实现具体的缩放以及透明度变化的效果;
同时在ViewPager的滑动要与下滑缩放区分开,因此需要监听OnPageChangeListener,并在onTouchEvent判断是否ViewPager在滑动中
public class DragViewPager extends ViewPager implements View.OnClickListener {
public static final int STATUS_NORMAL = 0;//正常浏览状态
public static final int STATUS_MOVING = 1;//滑动状态
public static final int STATUS_RESETTING = 2;//返回中状态
public static final String TAG = "DragViewPager";
public static final float MIN_SCALE_SIZE = 0.3f;//最小缩放比例
public static final int BACK_DURATION = 300;//ms
public static final int DRAG_GAP_PX = 50;
private int currentStatus = STATUS_NORMAL;
private int currentPageStatus;
private float mDownX;
private float mDownY;
private float screenHeight;
/**
* 要缩放的View
*/
private View currentShowView;
/**
* 滑动速度检测类
*/
private VelocityTracker mVelocityTracker;
private IAnimClose iAnimClose;
public void setIAnimClose(IAnimClose iAnimClose) {
this.iAnimClose = iAnimClose;
}
public DragViewPager(Context context) {
super(context);
init(context);
}
public DragViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context context) {
screenHeight = ScreenUtils.getScreenHeight(context);
setBackgroundColor(Color.BLACK);
addOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
currentPageStatus = state;
}
});
}
public void setCurrentShowView(View currentShowView) {
this.currentShowView = currentShowView;
if (this.currentShowView != null) {
this.currentShowView.setOnClickListener(this);
}
}
//配合SubsamplingScaleImageView使用,根据需要拦截ACTION_MOVE
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (getAdapter() instanceof ImagePagerAdapter) {
ImagePagerAdapter adapter = ((ImagePagerAdapter) getAdapter());
SubsamplingScaleImageView mImage = (SubsamplingScaleImageView) adapter.getItem(getCurrentItem()).getView().findViewById(R.id.image);
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
Log.e("jc","onInterceptTouchEvent:ACTION_DOWN");
mDownX = ev.getRawX();
mDownY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
Log.e("jc","onInterceptTouchEvent:ACTION_MOVE");
if (mImage.getCenter() != null && mImage.getCenter().y <= mImage.getHeight() / mImage.getScale() / 2) {
Log.e("jc","onInterceptTouchEvent:ACTION_MOVE");
int deltaX = Math.abs((int) (ev.getRawX() - mDownX));
int deltaY = (int) (ev.getRawY() - mDownY);
if (deltaY > DRAG_GAP_PX && deltaX <= DRAG_GAP_PX) {//往下移动超过临界,左右移