`

Android左滑菜单

阅读更多

首先要介绍一下Scroller 对象。

参考:http://blog.csdn.net/bigconvience/article/details/26697645

Scroller 启不到对View滑动的作动,View的滑动效果要由View自己的scrollTo()、scrollBy()、computeScroll() 等方法完成!通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。 

 

注意:调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。如果想改变莫个View在屏幕中的位置,可以使用如下的方法。

调用public void offsetLeftAndRight(int offset)用于左右移动方法或

       public void offsetTopAndBottom(int offset)用于上下移动。

如:button.offsetLeftAndRignt(300)表示将button控件向左移动300个像素。

scrollTo(int x, int y) 是将View中内容滑动到相应的位置,参考的坐标系原点为parent View的左上角。

(这一点很重要,我们的移动只是对View的内容进行移动!)

 

getScrollX()和getScrollY()是View类中专门用于记录滑动位置的方法!

 

下面是我写的一个常用的左滑菜单的例子!

public class ScrollLinearLayout extends LinearLayout {

	public static final String tag = "scroll";

	private Context mContext;

	// 这个类封装了滚动操作。滚动的持续时间可以通过构造函数传递,并且可以指定滚动动作的持续的最长时间。
	// 经过这段时间,滚动会自动定位到最终位置,并且通过computeScrollOffset()会得到的返回值为false,表明滚动动作已经结束。
	private Scroller mScroller;

	private int mLastX = 0;
	private int mLastY = 0;

	private int mHolderWidth = 120;

	public ScrollLinearLayout(Context context) {
		super(context);
		initWidgets(context);
	}

	public ScrollLinearLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		initWidgets(context);
	}

	private void initWidgets(Context context) {
		mContext = context;
		mScroller = new Scroller(mContext);

	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		return super.dispatchTouchEvent(ev);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		// return super.onInterceptTouchEvent(ev);
		return true;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int x = (int) event.getX();// 当前动作相对View的X坐标
		int y = (int) event.getY();// 当前动作相对View的Y坐标

		int currentScrollX = getScrollX();// 当前View在X方向上的偏移量

		Log.e(tag, "x== " + x + " y== " + y + " scrollX==" + currentScrollX);

		if (MotionEvent.ACTION_DOWN == event.getAction()) {
			Log.e(tag, "MotionEvent.ACTION_DOWN");

			if (!mScroller.isFinished()) {// 上一次的动作还未结束,则滚动到最终x与y位置时中止动画
				mScroller.abortAnimation();// 停止动画。与forceFinished(boolean)相反,Scroller滚动到最终x与y位置时中止动画。
			}

			return true;
		} else if (MotionEvent.ACTION_UP == event.getAction()) {
			Log.e(tag, "MotionEvent.ACTION_UP");
			int newScrollX = 0;
			if (currentScrollX - mHolderWidth * 0.4 > 0) {// 向上动作时若已向右滑超过了4/10就直接向右滑100%
				newScrollX = mHolderWidth;
			}

			this.smoothScrollTo(newScrollX, 0);

		} else if (MotionEvent.ACTION_MOVE == event.getAction()) {
			Log.e(tag, "MotionEvent.ACTION_MOVE");
			int deltaX = x - mLastX;// 与上一个动作的偏移量(X方向)
			int deltaY = y - mLastY;// 与上一个动作的偏移量(Y方向)

			Log.e(tag, "deltaX== " + deltaX + " deltaY== " + deltaY);

			if (Math.abs(deltaX) > Math.abs(deltaY) * 2) {
				if (0 != deltaX) {
					int newScrollX = currentScrollX - deltaX;// 计算最新的X方向上的偏移量
					if (newScrollX < 0) {
						newScrollX = 0;
					} else if (newScrollX > mHolderWidth) {
						newScrollX = mHolderWidth;
					}
					this.scrollTo(newScrollX, 0);
				}
			}
		}
		mLastX = x;
		mLastY = y;
		return super.onTouchEvent(event);
	}

	// 缓慢滚动到指定位置
	private void smoothScrollTo(int destX, int destY) {
		int scrollX = getScrollX();
		int delta = destX - scrollX;
		mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);
		invalidate();
	}

	@Override
	public void computeScroll() {
		Log.e(tag, "computeScroll getCurrX==" + mScroller.getCurrX()
				+ " getCurrY==" + mScroller.getCurrY());
		if (mScroller.computeScrollOffset()) {
			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			postInvalidate();
		}
	}

}

 用法:

<com.study.widgets.ScrollLinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#000000"
        android:orientation="horizontal" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#096722" />

        <RelativeLayout
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:background="#903109" >
        </RelativeLayout>
    </com.study.widgets.ScrollLinearLayout>

 

 

0
1
分享到:
评论

相关推荐

    Android代码-基于itemtouchhelper,实现左滑菜单,删除确认

    itemtouchhelper-extension This library add something for swipe item settling, recover base on the Itemtouchhelper. This used in the repo code-reader Download Sample Screenshot item swipe with spring ...

    Android代码-仿slidingmune的app左滑菜单效果.rar

    【标题】"Android代码-仿slidingmune的app左滑菜单效果.rar"指的是一个Android应用程序的源代码,它实现了类似SlidingMenu的左滑动菜单功能。SlidingMenu是Android开发中常用的库,用于创建侧滑出的导航菜单,通常在...

    Android高级应用源码-仿slidingmune的app左滑菜单效果.zip

    【标题】"Android高级应用源码-仿slidingmune的app左滑菜单效果.zip" 涉及的知识点主要集中在Android应用开发中常见的UI交互设计,特别是侧滑菜单(Sliding Menu)的实现。在Android应用设计中,侧滑菜单通常被用于...

    仿手机QQ好友页面左滑菜单

    "仿手机QQ好友页面左滑菜单"的项目,旨在模仿手机QQ应用中的一个常见功能:当用户在好友列表中点击并左滑一个好友条目时,会显示一个菜单,通常包含删除等操作选项。这一设计提升了用户操作的便捷性,也使得应用界面...

    Android-SwapMenuRecyclerView支持左滑显示菜单的RecyclerView

    在Android应用开发中,RecyclerView是一种常用的布局管理器,它用于高效地展示大量数据集合,并支持滚动操作。在很多情况下,开发者需要实现类似“抽屉”或“侧滑菜单”的功能,让用户可以对列表中的每一项进行更多...

    Android开发之开发者头条(二)实现左滑菜单

    在Android应用开发中,创建一个具有左滑菜单的界面是一个常见的需求,这使得用户能够方便地访问附加功能或导航选项。在本篇文章中,我们将深入探讨如何使用Android自带的`DrawerLayout`控件来实现这一功能,就像在...

    仿slidingmune的app左滑菜单效果

    在Android应用开发中,创建一个类似SlidingMenu的左滑菜单效果是一项常见的需求。SlidingMenu库曾是Android平台上广泛使用的实现侧滑菜单效果的第三方库,它为开发者提供了便捷的方式来实现这种交互式设计。然而,...

    安卓SlidingMenu各种菜单侧滑菜单相关-仿slidingmune的app左滑菜单效果.rar

    【标题】"安卓SlidingMenu各种菜单侧滑菜单相关-仿slidingmune的app左滑菜单效果"指的是在Android应用开发中实现的一种常见的交互设计,即左侧抽屉式(侧滑)菜单。这种菜单通常在用户点击或者手势滑动时从屏幕左侧...

    android左滑插件

    总结起来,"android左滑插件"涉及到Android手势识别、事件处理、自定义视图、第三方库应用、动画效果以及布局管理等多个方面,这些都是Android开发中不可或缺的知识点。通过理解和掌握这些技术,开发者可以构建出...

    Android-LikeELMLeftLoad仿饿了么左滑跳转

    【Android-LikeELMLeftLoad仿饿了么左滑跳转】是一个针对Android开发者设计的开源项目,旨在实现类似饿了么应用中的左滑跳转功能。这一特性在许多移动应用中常见,它允许用户通过在主界面左滑来访问其他功能或者返回...

    带你实现开发者头条(二) 实现左滑菜单

    在Android开发中,实现一个类似“开发者头条”的左滑菜单是一项常见的需求,这不仅可以提升应用的用户体验,还能为用户提供更多的导航选项。本教程将详细讲解如何利用Android的`DrawerLayout`组件来创建这样一个功能...

    listview左滑删除菜单

    "listview左滑删除菜单"是指在ListView的每个Item(列表项)上实现一个可以从左侧滑动出来的删除菜单,这种功能通常被称为Swipe to Delete或者Slide to Remove。在描述中提到的"可单个或者多个菜单"意味着不仅可以为...

    Android仿QQ和iOS的ListView左滑出现删除和置顶等操作,可自定义菜单的操作和数量

    在Android开发中,为了提供类似QQ和iOS应用的交互体验,常常需要实现ListView或RecyclerView的左滑删除、置顶等功能。这些功能不仅提升了用户界面的交互性,还为用户提供了一种直观的操作方式。本篇文章将深入讲解...

    slidingmenu左右侧滑菜单

    滑动菜单(Sliding Menu)在移动应用设计中是一种常见的交互模式,特别是在Android平台上,它为用户提供了方便快捷的导航方式。SlidingMenu通常被用作应用的主要导航元素,允许用户从屏幕边缘向内滑动来展示或隐藏一...

    RecycleView左滑显示删除菜单(仿QQ)

    接下来,我们要实现左滑显示删除菜单的效果,这通常通过添加手势检测或使用第三方库如`SwipeRefreshLayout`或`ItemTouchHelper`来实现。具体步骤如下: 1. 使用`ItemTouchHelper`:这是一个辅助类,用于向`...

    Android 仿美团网实现左右滑动查看更多分类的功能

    在Android应用开发中,我们经常会遇到需要实现类似美团网那样,可以左右滑动查看不同分类的功能。这个功能的核心在于提供一个流畅的用户界面,让用户能够方便地浏览和切换多个类别。在这里,我们将深入探讨如何使用...

    仿QQ消息列表左滑弹出菜单,标记已读和删除

    7. **动画效果**:为使用户体验更佳,左滑菜单的展开和关闭可能会添加平滑的动画效果,这可能利用了Android的属性动画系统。 8. **手势检测**:除了使用ItemTouchHelper,开发者可能还自定义了手势检测逻辑,以确保...

    android-menudrawer-master menu drawer 滑动式菜单

    在Android应用开发中,滑动式菜单(通常称为侧滑菜单或者抽屉式菜单)是一种常见的界面设计元素,它提供了一种优雅的方式让用户在不离开当前屏幕的情况下访问其他功能或内容。`android-menudrawer-master`项目正是...

Global site tag (gtag.js) - Google Analytics