当前位置: 首页 > news >正文

龙岗网站建设公司怎么样wordpress小工具怎么使用

龙岗网站建设公司怎么样,wordpress小工具怎么使用,杭州旅游团购网站建设,深圳赶集同城网站建设一、滑动效果的产生滑动一个View#xff0c;本质区别就是移动一个View。改变当前View所在的坐标#xff0c;原理和动画相似不断改变坐标位置实现。实现View的滑动就必须监听滑动的事件#xff0c;并且根据事件传入的坐标#xff0c;动态且不断改变View的坐标#xff0c;从…一、滑动效果的产生 滑动一个View本质区别就是移动一个View。改变当前View所在的坐标原理和动画相似不断改变坐标位置实现。实现View的滑动就必须监听滑动的事件并且根据事件传入的坐标动态且不断改变View的坐标从而实现View跟随用户触摸的滑动而滑动。1、Android的坐标系 Android中将屏幕最左上角的顶点作为Android坐标系的原点从这个点向右是X轴正方向从这个点向下是Y轴正方向如下图 系统提供了getLocationOnScreen(int location[])这样的方法来获取Android坐标系中点的位置即该视图左上角在Android坐标系中的坐标。在触控事件中使用getRawX、getRawY方法所获得的坐标同样是Android坐标系中的坐标。 2、视图坐标系 Android中除了上面所说的这种坐标系之外还有一个视图坐标系它描述了子视图在父视图中的位置关系。这两种坐标系并不矛盾也不复杂他们的作用是相互相成的。与Android坐标系类似视图坐标系同样是以原点向右为X轴正方向以原点向下为Y轴正方向只不过在视图坐标系中原点不再是Android坐标系中的屏幕最左上角而是以父视图左上角为坐标原点如下图 在触控事件中通过getX、getY所获得的坐标系就是视图坐标系中的坐标。3、触控事件——MotionEvent 触控事件MotionEvent在用户交互中占着举足轻重的地位。首先看看MotionEvent封装的一些常用事件常量定义了触控事件的不同类型。//单点触摸按下动作 public static final int ACTION_DOWN 0;//单点触摸离开动作 public static final int ACTION_UP 1;//触摸点移动动作 public static final int ACTION_MOVE 2;//触摸动作取消 public static final int ACTION_CANCEL 3;//触摸动作超出边界 public static final int ACTION_OUTSIDE 4;//多点触摸按下动作 public static final int ACTION_POINTER_DOWN 5;//多点离开动作 public static final int ACTION_POINTER_UP 6;复制代码 通常情况会在onTouchEventMotionEvent event方法中通过event.getAction方法来获取触控事件的类型并使用switch-case方法来进行筛选这个代码的模式基本固定Override public boolean onTouchEvent(MotionEvent event) {//获取当前输入点的X、Y坐标视图坐标int x (int) event.getX();int y (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN://处理按下事件break;case MotionEvent.ACTION_MOVE://处理移动事件break;case MotionEvent.ACTION_UP://处理离开事件break;}return true; }复制代码 在不涉及多点操作的情况下通常可以使用以上代码来完成触控事件的监听。 在Android中系统提供了非常多的方法来获取坐标值、相对距离等。方法丰富固然好下面对坐标系的API进行总结如下图这些方法可以分为如下两个类别View提供的获取坐标方法getTop()获取到的是View自身的顶边到其父布局顶边的距离。getLeft()获取到的是View自身的左边到其父布局最左边的距离。getRight()获取到的是View自身的右边到其父布局左边的距离。getBottom()获取到的是View自身的底边到其父布局顶边的距离。MotionEvent提供的方法getX()获取点击事件距离空间左边的距离即视图坐标。getY()获取点击事件距离控件顶边的距离即视图坐标。getRawX()获取点击事件距离整个屏幕左边的距离即绝对坐标。getRawY()获取点击事件距离整个屏幕顶边的距离即绝对坐标。二、实现滑动的七种方式 当了解Android坐标系和触控事件后我们再来看看如何使用系统提供的API来实现动态地修改一个View坐标即实时滑动效果。而不管采用哪一种方式其实现的思想基本是一致的当触摸View时系统记下当前触摸点坐标当手指移动时系统记下移动后的触摸点坐标从而获取到相对于前一次坐标点的偏移量并通过偏移量来修改View的坐标这样不断重复实现滑动过程。 通过一个实例看看Android中该如何实现滑动效果定义一个View处于LinearLayout中实现一个简单布局?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalcom.xjf.drawview.DragView1android:layout_width100dpandroid:layout_height100dp //LinearLayout复制代码 我们的目的就是让这个自定义的View随着手指在屏幕上的滑动而滑动。初始化时显示效果1、layout方法 在View绘制时会调用onLayout()方法来设置显示的位置。同样可以通过修改View的lefttoprightbottom四个属性来控制View的坐标。与前面提供的模板代码一样在每次回调onTouchEvent的时候我们都来获取一下触摸点的坐标代码如下//获取当前输入点的X、Y坐标视图坐标 int x (int) event.getX(); int y (int) event.getY();复制代码 接着在Action_DOWN事件中记录触摸点的坐标如下case MotionEvent.ACTION_DOWN:// 记录触摸点坐标lastX x;lastY y;break;复制代码 最后可以在Action_MOVE事件中计算偏移量并将偏移量作用到Layout方法中在目前Layout的lefttoprightbottom基础上增加计算出来的偏移量代码如下所示case MotionEvent.ACTION_MOVE:// 计算偏移量int offsetX x - lastX;int offsetY y - lastY;// 在当前left、top、right、bottom的基础上加上偏移量layout(getLeft() offsetX,getTop() offsetY,getRight() offsetX,getBottom() offsetY);break;复制代码 这样没错移动后View都会调用Layout方法来对自己重新布局从而达到移动View的效果。 上面的代码中使用的是getX()、getY()方法来获取坐标值即通过视图坐标来获取偏移量。当然同样可以使用getRawX()、getRawY()来获取坐标并使用绝对坐标来计算偏移量代码如下// 视图坐标方式 Override public boolean onTouchEvent(MotionEvent event) {int x (int) event.getRawX();int y (int) event.getRawY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 记录触摸点坐标lastX x;lastY y;break;case MotionEvent.ACTION_MOVE:// 计算偏移量int offsetX x - lastX;int offsetY y - lastY;// 在当前left、top、right、bottom的基础上加上偏移量layout(getLeft() offsetX,getTop() offsetY,getRight() offsetX,getBottom() offsetY);//重新设置初始化坐标lastX x;lastY y;break;}return true; }复制代码 使用绝对坐标系有一点非常需要注意的地方就是在每次执行完ACTION_MOVE的逻辑后一定要重新设置初始化坐标这样才能准确地获取偏移量。2、offsetLeftAndRight()与offsetTopAndBottom() 这个方法相当于系统提供的一个对左右、上下移动的API的封装。当计算出偏移量后只需要使用如下代码就可以完成View的重新布局效果与使用Layout方法一样代码如下所示//同时对left和right进行偏移 offsetLeftAndRight(offsetX); //同时对top和bottom进行偏移 offsetTopAndBottom(offsetY);复制代码 这里的offsetX、offsetY与在layout方法中计算offset方法一样。3、LayoutParams LayoutParams保存了一个View的布局参数。因此可以在程序中通过改变LayoutParams来动态地修改一个布局的位置参数从而达到改变View位置的效果。我们可以很方便在程序中使用getLayoutParams()来获取一个View的LayoutParams。当然计算偏移量的方法与在Layout方法中计算offset也是一样。当获取到偏移量之后就可以通过setLayoutParams来改变其LayoutParams代码如下LinearLayout.LayoutParams layoutParams (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin getLeft() offsetX; layoutParams.topMargin getTop() offsetY; setLayoutParams(layoutParams);复制代码 这里getLayoutParams()获取LayoutParams时需要根据View所在View父布局的类型来设置不同的类型比如这里将View放在LinearLayout中那么就可以使用LinearLayout.LayoutParams。如果在RelativeLayout中就要使用RelativeLayout.LayoutParams。这一切的前提是你必须要有一个父布局不然系统无法获取LayoutParams。 在通过改变LayoutParams来改变一个View的位置时通常改变的是这个View的Margin属性所以除了使用布局的LayoutParams之外还可以使用ViewGroup.MarginLayoutParams来实现这一一个功能代码ViewGroup.MarginLayoutParams layoutParams (ViewGroup.MarginLayoutParams) getLayoutParams(); layoutParams.leftMargin getLeft() offsetX; layoutParams.topMargin getTop() offsetY; setLayoutParams(layoutParams);复制代码 我们可以发现使用ViewGroup.MarginLayoutParams更加的方便不需要考虑父布局的类型当然它们的本质都是一样。4、scrollTo与scrollBy 在一个View中系统提供了scrollTo、scrollBy两种方式来改变一个View的位置。这两个方法的区别非常好理解与英文中To与By的区别类似scrollTo(x,y)表示移动到一个具体的坐标点(x,y),而scrollBy(dx,dy)表示移动的增量为dxdy。 与前面几种方式相同在获取偏移量后使用scrollBy来移动View代码如下int offsetX x - lastX; int offsetY y - lastY; scrollBy(offsetX, offsetY);复制代码 但是当我们拖动View的时候你会发现View并没有移动其实方法没错View确实移动了只是移动的并不是我们想要的东西。scrollTo、scrollBy方法移动的是View的content即让View的内容移动如果在ViewGroup中使用scrollTo、scrollBy方法那么移动的将是所有子View如果在View中使用那么移动的将是View的内容例如TextViewcontent就是它的文本ImageViewcontent就是它的drawable对象。 通过以上的分析现在知道为什么不能再View中使用这两个方法来拖动这个View了。那么我们就该View所在的ViewGroup中来使用scrollBy方法移动它的子View代码如下((View) getParent()).scrollBy(offsetX, offsetY);复制代码 但是再次拖动View的时候你会发现View虽然移动了但却在乱动并不是我们想要的跟随触摸点的移动而移动。这里先看一下视图移动不妨这样想象一下手机屏幕是一个中空的盖板盖板下面是一个巨大的画布也就是我们想要显示的视图。当把这个盖板盖在画布上的某一处时透过中间空的矩形我们看见了手机屏幕上显示的视图而画布上其他地方的视图则被盖板盖住了无法看见。我们的视图与这个例子非常类似我们没有看见视图并不代表它就不存在有可能只是在屏幕外面而已。当调用scrollBy方法时可以想象为外面的盖板在移动这么说比较抽象。 下图一中间的矩形相当于屏幕及可视区域。后面的content就相当于画布代表视图。可以看到只有视图的中间部分目前是可视的其他部分都不可见。在可见区域中我们设置了一个Button它的坐标为(20,10)。 下面使用scrollBy方法将盖板屏幕、可视区域在水平方向上向X轴正方向向右平移20在竖直方向上向Y轴正方向下方平移10那么平移之后的可视区域如图二。 图一 图二、移动之后的可视区域 我们发现虽然设置scrollBy20,10偏移量均为X轴、Y轴正方向上的正数但是在屏幕的可视区域内Button却向X轴、Y轴负方向上移动了。这就是因为参考系选择的不同而产生的不同效果。 通过上面的分析可以发现如果讲scrollBy中的参数dx和dy设置为正数那么content讲向坐标轴负方向移动如果将scrollBy中的参数dx和dy设置为负数那么content将向坐标轴正方向移动因此回到前面的例子要实现跟随着手指移动而滑动的效果就必须将偏移量改为负值代码如下int offsetX x - lastX; int offsetY y - lastY; ((View) getParent()).scrollBy(-offsetX, -offsetY);复制代码 现在在运行一次发现和前面几种方式效果相同了类似地使用绝对坐标时也可以通过使用scrollTo发方法来实现这一效果。5、Scroller 前面提到了scrollBy、scrollTo方法就不得不再来说一说Scroller类。Scroller类与scrollBy、scrollTo方法十分相似。什么区别先看例子如果要完成这样一个效果通过点击按钮让一个ViewGroup的子View向右移动100个像素。问题看起来很简单只要在按钮的点击事件中使用前面的scrollBy方法设置下偏移量就可以了吗确实这样可以让一个子ViewGroup中的子View平移但是不管使用scrollBy还是scrollTo方法子view的平移都是瞬间发生的在事件执行的时候平移就已经完成了这样的效果会让人感觉非常突然Google建议使用自然的过度动画来实现移动效果。因此Scroller类就这样诞生了通过Scroller类可以实现平滑移动的效果而不是瞬间就完成移动。 Scroller类的实现原理其实它与前面使用的scrollTo和scrollBy方法来实现子View跟随手指移动的原理基本类似虽然scrollBy芳芳法是让子View瞬间从某点移动到另一个点但是由于在ACTION_MOVE事件中不断获取手指移动的微小的偏移量这样就将一段距离划分成了N个非常小的偏移量。虽然每个偏移量里面通过scrollBy方法进行了瞬间移动但是在整体上却可以获得一个平滑移动的效果。这个原理与动画的实现原理也是基本类似的它们都是利用了人眼的视觉暂留特性。 下面我们使用Scroller类实现平滑移动在这个实例中同样让子View跟随手指的滑动而滑动但是在手指离开屏蔽时让子View平滑的移动到初始化位置即屏幕左上角。使用Scroller类需要如下三个步骤初始化Scroller 首先通过它的构造方法来创建一个Scroller对象代码如下所示// 初始化Scroller mScroller new Scroller(context);复制代码重写computerScroller方法实现模拟滑动 下面我们需要重写computerScroller芳芳法它是使用Scroller类的核心系统在绘制View的时候会在draw方法中调用该方法。这个方法实际就是使用的scrollTo方法。再结合Scroller对象帮助获取到当前滚动值。我们可以通过不断地瞬间移动一个小的距离来实现整体上的平滑移动效果。代码如下Override public void computeScroll() {super.computeScroll();// 判断Scroller是否执行完毕if (mScroller.computeScrollOffset()) {((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());// 通过重绘来不断调用computeScrollinvalidate();} }复制代码 Scroller类提供了computeScrollOffset方法来判断是否完成了整个滑动同时也提供了getCurrX()、getCurrY()方法来获得当前的滑动坐标。在上面的代码中唯一需要注意的是invalidate()方法因为只能在computeScroller()方法中获取模拟过程中的scrollX和scrollY坐标。但computeScroll()方法是不会自动调用的只能通过invalidate()-draw()-computeScroll()来间接调用compuetScroll()方法所以需要在compuetScroll()方法中调用invaliDate(方法实现循环获取scrollX和scrollY的目的。而当模拟过程结束后scroller.compuetScrollOffset()方法会返回false而中断循环完成平滑移动过程。 startScroll开启模拟过程 我们在需要使用平滑移动的事件中使用Scroller类的startScroll()方法来开启平滑移动过程。startScroll()方法具有两个重载方法。public void startScroll(int startX, int startY, int dx, int dy)复制代码public void startScroll(int startX, int startY, int dx, int dy, int duration)复制代码 可以看到它们的区别就是一个具有指定的支持时长而另一个没有。很好理解与在动画中设置duration和使用默认的显示时长是一个道理。其他四个坐标则与他们的命名含义相同就是起始坐标与偏移量。在获取坐标时通常可以使用getScrollX()和getScrollY()方法来获取父视图中content所滑动到的点的坐标需要注意的是这个值的正负它与在scrollBy、scrollTo中讲解的情况是一样的。 根据以上三步就可以使用Scroller类实现平滑移动在构造方法中初始化Scroller对象重写View的computerScroll()方法最后监听手指离开屏蔽的事件并在该事件中调用startScroll(方法完成平滑移动。监听手指离开屏幕的事件只需要在onTouchEvent中增加一个ACTION_UP监听选项即可代码如下所示case MotionEvent.ACTION_UP:// 手指离开时执行滑动过程View viewGroup ((View) getParent());mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-viewGroup.getScrollX(),-viewGroup.getScrollY());invalidate();break;复制代码 在startScroll()方法中我们获取子View移动的距离-getScrollX()、getScrollY()并将偏移量设置为其相反数从而将子View滑动到原位置。这里的invalidate(方法是用来通知View进行重绘调用computeScroll()的模拟过程。当然也可以给startScroll方法增加一个duration的参数来设置滑动的持续时长。6、属性动画 属性动画请参见我的另一篇Android全套动画使用技巧7、ViewDragHelper Google在其support库中为我们提供了DrawerLayout和SlidingPaneLayout两个布局来帮助开发者实现侧边栏滑动的效果。这两个新的布局方便我们创建自己的滑动布局界面在这两个强大布局背后有一个功能强大的类——ViewDragHelper。通过ViewDragHelper基本可以实现各种不同的滑动、拖放需求因此这个方法也是各种滑动解决方案中的终结绝招。 下面演示一个使用ViewDragHelper创建一个QQ侧边栏滑动的布局如图 图三 图四初始化ViewDragHelper 首先需要初始化ViewDragHelperViewDragHelper通常定义在一个ViewGroup的内部通过静态工厂方法进行初始化代码如下mViewDragHelper ViewDragHelper.create(this, callback);复制代码 第一个参数监听的View通常需要一个ViewGroup即parentView第二个参数是一个Callback回调这个回调就是整个ViewDragHelper的逻辑核心。拦截事件 重写拦截事件将事件传递给ViewDragHelper进行处理Override public boolean onInterceptTouchEvent(MotionEvent ev) {return mViewDragHelper.shouldInterceptTouchEvent(ev); }Override public boolean onTouchEvent(MotionEvent event) {//将触摸事件传递给ViewDragHelper,此操作必不可少mViewDragHelper.processTouchEvent(event);return true; }复制代码处理computeScroll() 使用ViewDragHelper同样需要重写computeScroll()方法因为ViewDragHelper内部也是通过Scroller来实现平滑移动的。Override public void computeScroll() {if (mViewDragHelper.continueSettling(true)) {ViewCompat.postInvalidateOnAnimation(this);} }复制代码处理回调Callback 创建一个ViewDragHelper.Callback private ViewDragHelper.Callback getCallback new ViewDragHelper.Callback() {Overridepublic boolean tryCaptureView(View child, int pointerId) {return false;} };复制代码 as自动重写tryCaptureView()方法通过这个方法可以指定在创建ViewDragHelper时参数parentView中的哪一个子Vieww可以被移动例如我们在这个实例中自定义一个ViewGroup里面定义了两个子View——Menu View和MainView如下代码// 何时开始检测触摸事件 Override public boolean tryCaptureView(View child, int pointerId) {//如果当前触摸的child是mMainView时开始检测return mMainView child; }复制代码 具体垂直滑动方法clampViewPositionVertical()和水平滑动方法clampViewPositionHorizontal()。实现滑动这个两个方法必须写默认返回值是0即不发生滑动当然如果只重写clampViewPositionVertical()或clampViewPositionHorizontal()中的一个那么就只会实现该方向上的滑动效果。// 处理垂直滑动 Override public int clampViewPositionVertical(View child, int top, int dy) {return top; }// 处理水平滑动 Override public int clampViewPositionHorizontal(View child, int left, int dx) {return left; }复制代码 clampViewPositionVertical(View child, int top, int dy)中的参数top代表在垂直方向上child移动的距离dy则表示比较前一次的增量。clampViewPositionHorizontal(View child, int left, int dx)也是类似的含义通常情况下只需要返回top和left即可但需要更加精确地计算padding等属性的时候就需要对left进行一些处理并返回合适大小的值。 通过重写上面的三个方法就可以实现基本的滑动效果。当用手拖动MainView的时候它就可有跟随手指的滑动而滑动了代码private ViewDragHelper.Callback callback new ViewDragHelper.Callback() {// 何时开始检测触摸事件Overridepublic boolean tryCaptureView(View child, int pointerId) {//如果当前触摸的child是mMainView时开始检测return mMainView child;}// 处理垂直滑动Overridepublic int clampViewPositionVertical(View child, int top, int dy) {return 0;}// 处理水平滑动Overridepublic int clampViewPositionHorizontal(View child, int left, int dx) {return left;}};复制代码 在前面的Scroller中讲解时实现一个效果——手指离开屏幕后View滑动回到初始位置。现在使用ViewDragHelper实现在ViewDragHelper.Callback中系统提供了这样的方法——onViewReleased()通过重写这个方法可以非常简单地实现当手指离开屏幕后实现的操作。这个方法内部是使用Scroller类实现的这也是前面重写computeScroll()方法的原因。Override public void onViewReleased(View releasedChild, float xvel, float yvel) {super.onViewReleased(releasedChild, xvel, yvel);//手指抬起后缓慢移动到指定位置if (mMainView.getLeft() 500) {//关闭菜单//等同于Scroll的startScroll方法mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0);ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);} else {//打开菜单mViewDragHelper.smoothSlideViewTo(mMainView,300,0);ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);} }复制代码 设置让MainView移动后左边距小于500像素的时候就使用smoothSlideViewTo(方法来讲MainView还原到初始状态即坐标0,0左边距大于500则将MainView移动到300,0坐标即显示MainView。//ViewDragHelpermViewDragHelper.smoothSlideViewTo(mMainView, 0, 0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);复制代码//ScrollermScroller.startScroll(x,y,dx,dy); invalidate();复制代码 滑动的时候在自定义ViewGroup的onFinishInflate()方法中按照顺序将子View分别定义成MenuView和MainView并在onSizeChanged方法中获得View的宽度。如果需要根据View的宽度来处理滑动后的效果就可以使用这个值判断。/**** 加载完布局文件后调用*/ Override protected void onFinishInflate() {super.onFinishInflate();mMenuView getChildAt(0);mMainView getChildAt(1); }Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth mMenuView.getMeasuredWidth(); }复制代码 最后整个通过ViewDragHelper实现QQ侧滑功能代码package com.xjf.drawview;import android.content.Context; import android.support.v4.view.ViewCompat; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout;public class DragViewGroup extends FrameLayout {private ViewDragHelper mViewDragHelper;private View mMenuView, mMainView;private int mWidth;public DragViewGroup(Context context) {super(context);initView();}public DragViewGroup(Context context, AttributeSet attrs) {super(context, attrs);initView();}public DragViewGroup(Context context,AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}/**** 加载完布局文件后调用*/Overrideprotected void onFinishInflate() {super.onFinishInflate();mMenuView getChildAt(0);mMainView getChildAt(1);}Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth mMenuView.getMeasuredWidth();}Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return mViewDragHelper.shouldInterceptTouchEvent(ev);}Overridepublic boolean onTouchEvent(MotionEvent event) {//将触摸事件传递给ViewDragHelper,此操作必不可少mViewDragHelper.processTouchEvent(event);return true;}private void initView() {mViewDragHelper ViewDragHelper.create(this, callback);}private ViewDragHelper.Callback callback new ViewDragHelper.Callback() {// 何时开始检测触摸事件Overridepublic boolean tryCaptureView(View child, int pointerId) {//如果当前触摸的child是mMainView时开始检测return mMainView child;}// 触摸到View后回调Overridepublic void onViewCaptured(View capturedChild,int activePointerId) {super.onViewCaptured(capturedChild, activePointerId);}// 当拖拽状态改变比如idledraggingOverridepublic void onViewDragStateChanged(int state) {super.onViewDragStateChanged(state);}// 当位置改变的时候调用,常用与滑动时更改scale等Overridepublic void onViewPositionChanged(View changedView,int left, int top, int dx, int dy) {super.onViewPositionChanged(changedView, left, top, dx, dy);}// 处理垂直滑动Overridepublic int clampViewPositionVertical(View child, int top, int dy) {return 0;}// 处理水平滑动Overridepublic int clampViewPositionHorizontal(View child, int left, int dx) {return left;}// 拖动结束后调用Overridepublic void onViewReleased(View releasedChild, float xvel, float yvel) {super.onViewReleased(releasedChild, xvel, yvel);//手指抬起后缓慢移动到指定位置if (mMainView.getLeft() 500) {//关闭菜单//相当于Scroller的startScroll方法mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0);ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);} else {//打开菜单mViewDragHelper.smoothSlideViewTo(mMainView, 300, 0);ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);}}};Overridepublic void computeScroll() {if (mViewDragHelper.continueSettling(true)) {ViewCompat.postInvalidateOnAnimation(this);}} }复制代码 除此之外ViewDragHelper很多强大的功能还没得到展示在ViewDragHelper.Callback中系统定义了大量的监听事件来帮助我们处理各种事件如下onViewCaptured()这个事件在用户触摸到View后回调onViewDragStateChanged()这个事件在拖拽状态改变时回调比如idledragging等状态 STATE_IDLEView当前没有被拖拽也没执行动画只是安静地待在原地 STATE_DRAGGINGView当前正在被拖动由于用户输入或模拟用户输入导致View位置正在改变 STATE_SETTLINGView当前正被安顿到指定位置由fling手势或预定义的非交互动作触发onViewPositionChanged()//view在拖动过程坐标发生变化时会调用此方法包括两个时间段手动拖动和自动滚动。
http://www.pierceye.com/news/117222/

相关文章:

  • 惠安建设局网站做基础销量的网站
  • 网页制作与网站建设自考制作ppt的软件免费下载
  • 会员类网站模板wordpress写主题
  • wordpress网站分享朋友圈缩略图wordpress 密码爆破
  • 总结网站推广策划思路的内容佛山做外贸网站哪家好
  • 阿里云服务器如何做两个网站网站建站对象
  • 做网站毕业实训报告网站架构企业收费标准
  • 高端品牌网站建设公司哪家好网页设计与制作个人总结
  • 自己电脑建设网站哈尔滨专业网站建设哪个好
  • 福建设计招标网站移动端网站和app开发
  • 山东网站制作团队门户网站内容管理建设方案
  • 新开传奇网站排行中国建设网官方网站app
  • 网站营运费广州网络公司建站
  • 小吃网站建设如何提高网站收录量
  • 全球网站域名做网站设计学那个专业好
  • 新手学网站建设解疑与技巧1200例北京网络行业协会
  • 医生工作室网站建设sae wordpress 主题
  • 防水网站怎么做义乌 外贸网站 开发
  • 中国做外贸的网站有哪些内容虚拟商品购物网站源码
  • 如何将数据写入wordpress文站房屋装修案例
  • 做网站的积木式编程网站开发中的qq登录
  • 官方网站作用咨询公司简介
  • 个人手机版网站建设电影网站模板html
  • 招聘网站开发源码广州服务类拓客软件
  • 婚庆策划公司加盟江门关键词优化价格
  • 百度网站入口ps网页设计实验报告
  • 做网站准备材料怎么做优化网站排名
  • asp技校网站手游网页版
  • 网站建设合同要交印花税吗烟台网站的建设
  • 可以做锚文本链接的网站广告公司创意广告语