Android仿微信圖片詳情頁面,可下拉關閉頁面
阿新 • • 發佈:2020-12-14
話不多說,直接上效果圖
imagereview.gifImageReview
在這個庫裡面用到了第三方的縮放圖片檢視庫
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) {//往下移動超過臨界,左右移動不超過臨界時,攔截滑動事件
return true;
}
}
break;
case MotionEvent.ACTION_UP:
Log.e("jc","onInterceptTouchEvent:ACTION_UP");
break;
}
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (currentStatus == STATUS_RESETTING)
return false;
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getRawX();
mDownY = ev.getRawY();
addIntoVelocity(ev);
break;
case MotionEvent.ACTION_MOVE:
addIntoVelocity(ev);
int deltaY = (int) (ev.getRawY() - mDownY);
//手指往上滑動
if (deltaY <= DRAG_GAP_PX && currentStatus != STATUS_MOVING)
return super.onTouchEvent(ev);
//viewpager不在切換中,並且手指往下滑動,開始縮放
if (currentPageStatus != SCROLL_STATE_DRAGGING && (deltaY > DRAG_GAP_PX || currentStatus == STATUS_MOVING)) {
moveView(ev.getRawX(), ev.getRawY());
return