Android 仿微信,朋友圈右滑退出
来源:互联网 发布:linux复制压缩包 编辑:程序博客网 时间:2024/05/22 12:27
直接上代码:
public class SlideLinearLayout extends LinearLayout { private Logger log = Logger.getLogger(SlideLinearLayout.class.getName()); private Scroller mScroller; private ViewGroup mParentView; private float downX; private float downY; private float tempX; private int viewWidth; private boolean isSilding; private int mTouchSlop; private boolean isFinish; private int MIN_DISTANCE; private float mLastMotionX; private float mLastMotionY; private int mActivePointerId = INVALID_POINTER; private boolean mIsBeingDragged = false; private static final int INVALID_POINTER = -1; private OnListener onListener; public SlideLinearLayout(Context context) { super(context); init(); } public SlideLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SlideLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (changed) { mParentView = (ViewGroup) this.getParent(); viewWidth = this.getWidth(); } } /** * 滚动出界面 */ private void scrollRight() { final int delta = (viewWidth + mParentView.getScrollX()); // 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0, Math.abs(delta)); postInvalidate(); } /** * 滚动到起始位置 */ private void scrollOrigin() { int delta = mParentView.getScrollX(); mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0, Math.abs(delta)); postInvalidate(); } private void init() { mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); mScroller = new Scroller(getContext()); MIN_DISTANCE = DisplayUtil.dip2px(getContext(), 30); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { log.debug("onInterceptTouchEvent event: " + ev.getAction()); final int action = ev.getAction() & MotionEventCompat.ACTION_MASK; if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { // Release the drag. resetTouch(); return false; } if (action != MotionEvent.ACTION_DOWN) { if (mIsBeingDragged) { return true; } } switch (action) { case MotionEvent.ACTION_MOVE: { final int activePointerId = mActivePointerId; if (activePointerId == INVALID_POINTER) { // If we don't have a valid id, the touch down wasn't on content. break; } final int pointerIndex = ev.findPointerIndex(activePointerId); final float x = ev.getX(pointerIndex); final float xDiff = Math.abs(x - mLastMotionX); if (xDiff > mTouchSlop && mLastMotionX <= MIN_DISTANCE) { mIsBeingDragged = true; return true; } break; } case MotionEvent.ACTION_DOWN: { downX = tempX = mLastMotionX = ev.getX(); downY = mLastMotionY = ev.getY(); mActivePointerId = ev.getPointerId(0); break; } } return super.onInterceptTouchEvent(ev); } private void resetTouch() { mLastMotionX = 0; mLastMotionY = 0; mActivePointerId = INVALID_POINTER; mIsBeingDragged = false; tempX = 0; downX = 0; downY = 0; } @Override public void computeScroll() { // 调用startScroll的时候scroller.computeScrollOffset()返回true, if (mScroller.computeScrollOffset()) { mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { log.info("onTouchEvent " + event.getAction()); switch (event.getAction()) { case MotionEvent.ACTION_MOVE: int moveX = (int) event.getRawX(); int deltaX = (int) (tempX - moveX); tempX = moveX; if (Math.abs(moveX - downX) > mTouchSlop) { isSilding = true; } if (moveX - downX >= 0 && isSilding) { mParentView.scrollBy(deltaX, 0); log.info("moveX: " + moveX + " deltaX: " + deltaX); } else { log.error("moveX: " + (moveX - downX) + " isSilding: " + isSilding); } break; case MotionEvent.ACTION_UP: isSilding = false; if (event.getRawX() > viewWidth / 2) { isFinish = true; scrollRight(); if (onListener != null) { onListener.OnFinish(); } } else { scrollOrigin(); isFinish = false; } resetTouch(); break; case MotionEvent.ACTION_CANCEL: break; } return true; } public void setOnListener(OnListener onListener) { this.onListener = onListener; } public interface OnListener { void OnFinish(); }}
将此布局设置为activity根布局,即可实现效果。
注意要把activity 的背景设置为透明。
<style name="transparent_background" parent="@style/Theme.AppCompat.NoActionBar"> <item name="android:windowBackground">@color/transparent_color</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsTranslucent">true</item></style>
可利用以上代码进行设置!
0 0
- Android 仿微信,朋友圈右滑退出
- android activity右滑退出
- Android 右滑实现退出Activity
- Android 快速实现右滑退出效果
- 右滑退出SwipeBackLayout
- Android 右划退出功能
- Android应用开发-------------仿苹果右滑退出页面效果
- android 仿苹果pad左侧右滑退出界面
- Android实现SwipeBack(右滑退出)效果
- android Activity右滑返回,退出当前activity
- android项目添加activity右滑退出.返回的效果
- android Activity右滑返回,退出当前activity
- android Activity右滑返回,退出当前activity
- android 仿ios右滑退出当前activity
- Android 仿微信朋友圈查看
- 控件右滑退出当前界面
- 实现app全局activity右滑退出
- Activity右滑退出控件SlidingLayout
- synchronized 与 Lock 的那点事
- grid列自动换行
- 使用Java代码连接mysql数据库
- 仿支付宝微信支付密码界面弹窗封装dialog
- Google Protocol Buffer项目无法加载解决方案
- Android 仿微信,朋友圈右滑退出
- source insight使用教程
- 傅里叶变换
- poj 1753
- 不支持从 OTHER 到 BINARY 的转换错误
- leetcode26. Remove Duplicates from Sorted Array
- 编译的区别_函数的链接性
- 项目启动报错 java.lang.ClassNotFoundException: org. springframework.web.util.IntrospectorC
- 开发程序的目标