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

免费网站建设工具免费做手机网站

免费网站建设工具,免费做手机网站,深圳建设监理协会网站,网站建设平台有哪些原文地址#xff1a;https://developer.android.com/training/gestures/scale.html 这节课主要学习如何使用触摸手势来拖动、放大屏幕上的对象。 拖动对象 如果你的重点在Android 3.0以上的版本#xff0c;那么你可以使用内置的拖拽事件监听器View.OnDragListener。 触摸手…原文地址https://developer.android.com/training/gestures/scale.html 这节课主要学习如何使用触摸手势来拖动、放大屏幕上的对象。 拖动对象 如果你的重点在Android 3.0以上的版本那么你可以使用内置的拖拽事件监听器View.OnDragListener。 触摸手势最常见的操作就是使用它来拖动屏幕上的对象。下面的代码允许用户拖动屏幕上的图像。要注意以下几点 在拖动操作中APP会一直保持手指拖动的轨迹就算是另一只手指触到屏幕也是。举个例子想象一根手指在拖动着一张图像这时用户将第二根手指放置到屏幕上如果APP只是追踪单根手指的轨迹那么它会将第二根手指作为默认位置并会将图像移动到这个位置。为了防止这样的事件发生APP需要区分第一根手指与其它手指。为此需要追踪 ACTION_POINTER_DOWN 及 ACTION_POINTER_UP 。ACTION_POINTER_DOWN 及 ACTION_POINTER_UP在第二根手指落下或抬起的时候由onTouchEvent()方法传回。在ACTION_POINTER_UP的情况下示例提取了这个事件的索引并确保当前活动的指针不是那个已经不在屏幕上的指针。如果是那个指针的话那么APP会选择一个不同的指针使其活动并保存它的X及Y的位置。一旦这个值被保存下来那么APP将会使用正确指针的数据一直计算剩余移动的距离。 下面的代码允许用户在屏幕上拖动对象。它记录了当前活动指针的初始位置计算了它所位移的距离并将对象移动到新的位置上。 这里要注意代码段使用了getActionMasked()方法。你应该一直使用这个方法来接收MotionEvent对象的活动。与getAction()方法不同getActionMasked()工作于多点触控模式下。它会返回被执行的掩饰活动不包括指针的索引比特。 // The ‘active pointer’ is the one currently moving our object. private int mActivePointerId INVALID_POINTER_ID; Override public boolean onTouchEvent(MotionEvent ev) {// Let the ScaleGestureDetector inspect all events.mScaleDetector.onTouchEvent(ev);final int action MotionEventCompat.getActionMasked(ev); switch (action) { case MotionEvent.ACTION_DOWN: {final int pointerIndex MotionEventCompat.getActionIndex(ev); final float x MotionEventCompat.getX(ev, pointerIndex); final float y MotionEventCompat.getY(ev, pointerIndex); // Remember where we started (for dragging)mLastTouchX x;mLastTouchY y;// Save the ID of this pointer (for dragging)mActivePointerId MotionEventCompat.getPointerId(ev, 0);break;}case MotionEvent.ACTION_MOVE: {// Find the index of the active pointer and fetch its positionfinal int pointerIndex MotionEventCompat.findPointerIndex(ev, mActivePointerId); final float x MotionEventCompat.getX(ev, pointerIndex);final float y MotionEventCompat.getY(ev, pointerIndex);// Calculate the distance movedfinal float dx x - mLastTouchX;final float dy y - mLastTouchY;mPosX dx;mPosY dy;invalidate();// Remember this touch position for the next move eventmLastTouchX x;mLastTouchY y;break;}case MotionEvent.ACTION_UP: {mActivePointerId INVALID_POINTER_ID;break;}case MotionEvent.ACTION_CANCEL: {mActivePointerId INVALID_POINTER_ID;break;}case MotionEvent.ACTION_POINTER_UP: {final int pointerIndex MotionEventCompat.getActionIndex(ev); final int pointerId MotionEventCompat.getPointerId(ev, pointerIndex); if (pointerId mActivePointerId) {// This was our active pointer going up. Choose a new// active pointer and adjust accordingly.final int newPointerIndex pointerIndex 0 ? 1 : 0;mLastTouchX MotionEventCompat.getX(ev, newPointerIndex); mLastTouchY MotionEventCompat.getY(ev, newPointerIndex); mActivePointerId MotionEventCompat.getPointerId(ev, newPointerIndex);}break;}} return true; } 平移 上面的部分展示了如何在屏幕上拖动对象。另一个通用的场景就是平移了平移的意思是用户的拖动动作引起的x及y轴方向上的滚动。上面的代码直接将MotionEvent拦截实现拖动。这部分的代码将会采用另一种更具有优势的方法以便支持通用手势。它重写了GestureDetector.SimpleOnGestureListener的onScroll()方法。 只有用户在使用手指移动内容时onScroll()才会被调用。onScroll()只有在手指按下的时候才会调用一旦手指离开屏幕那么平移手势也随之终止。 下面是onScroll()的使用摘要 // The current viewport. This rectangle represents the currently visible // chart domain and range. private RectF mCurrentViewport new RectF(AXIS_X_MIN, AXIS_Y_MIN, AXIS_X_MAX, AXIS_Y_MAX);// The current destination rectangle (in pixel coordinates) into which the // chart data should be drawn. private Rect mContentRect;private final GestureDetector.SimpleOnGestureListener mGestureListener new GestureDetector.SimpleOnGestureListener() { ...Override public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {// Scrolling uses math based on the viewport (as opposed to math using pixels).// Pixel offset is the offset in screen pixels, while viewport offset is the// offset within the current viewport.float viewportOffsetX distanceX * mCurrentViewport.width()/ mContentRect.width();float viewportOffsetY -distanceY * mCurrentViewport.height()/ mContentRect.height();...// Updates the viewport, refreshes the display.setViewportBottomLeft(mCurrentViewport.left viewportOffsetX,mCurrentViewport.bottom viewportOffsetY);...return true; } 下面是setViewportBottomLeft()方法的实现它主要实现了移动内容的逻辑 /*** Sets the current viewport (defined by mCurrentViewport) to the given* X and Y positions. Note that the Y value represents the topmost pixel position,* and thus the bottom of the mCurrentViewport rectangle.*/ private void setViewportBottomLeft(float x, float y) {/** Constrains within the scroll range. The scroll range is simply the viewport* extremes (AXIS_X_MAX, etc.) minus the viewport size. For example, if the* extremes were 0 and 10, and the viewport size was 2, the scroll range would* be 0 to 8.*/float curWidth mCurrentViewport.width();float curHeight mCurrentViewport.height();x Math.max(AXIS_X_MIN, Math.min(x, AXIS_X_MAX - curWidth));y Math.max(AXIS_Y_MIN curHeight, Math.min(y, AXIS_Y_MAX));mCurrentViewport.set(x, y - curHeight, x curWidth, y);// Invalidates the View to update the display.ViewCompat.postInvalidateOnAnimation(this); } 缩放 在Detecting Common Gestures中我们讨论到GestureDetector可以帮助我们来检测比如滑动、滚动、长按等手势。而对于缩放Android提供了ScaleGestureDetector. GestureDetector 以及 ScaleGestureDetector。 为了可以反馈检测到的手势事件手势探测器使用了监听器对象ScaleGestureDetector.OnScaleGestureListener。如果你只关心部分手势的话Android还提供了ScaleGestureDetector.SimpleOnScaleGestureListener你可以通过重写它的方法来使用。 缩放基础示例 下面的代码是缩放所需要的基础 private ScaleGestureDetector mScaleDetector; private float mScaleFactor 1.f;public MyCustomView(Context mContext){...// View code goes here...mScaleDetector new ScaleGestureDetector(context, new ScaleListener()); }Override public boolean onTouchEvent(MotionEvent ev) {// Let the ScaleGestureDetector inspect all events.mScaleDetector.onTouchEvent(ev);return true; }Override public void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.save();canvas.scale(mScaleFactor, mScaleFactor);...// onDraw() code goes here...canvas.restore(); }private class ScaleListenerextends ScaleGestureDetector.SimpleOnScaleGestureListener {Overridepublic boolean onScale(ScaleGestureDetector detector) {mScaleFactor * detector.getScaleFactor();// Dont let the object get too small or too large.mScaleFactor Math.max(0.1f, Math.min(mScaleFactor, 5.0f));invalidate();return true;} } 稍微复杂点的示例 下面是一个稍微复杂一点的示例它摘自与这节课所提供的示例InteractiveChart(PS:示例工程请参见原网页)。InteractiveChart同时支持平移、缩放它使用了ScaleGestureDetector的“平移”(getCurrentSpanX/Y)及“焦点” (getFocusX/Y)特性 Override private RectF mCurrentViewport new RectF(AXIS_X_MIN, AXIS_Y_MIN, AXIS_X_MAX, AXIS_Y_MAX); private Rect mContentRect; private ScaleGestureDetector mScaleGestureDetector; ... public boolean onTouchEvent(MotionEvent event) {boolean retVal mScaleGestureDetector.onTouchEvent(event);retVal mGestureDetector.onTouchEvent(event) || retVal;return retVal || super.onTouchEvent(event); }/*** The scale listener, used for handling multi-finger scale gestures.*/ private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener new ScaleGestureDetector.SimpleOnScaleGestureListener() {/*** This is the active focal point in terms of the viewport. Could be a local* variable but kept here to minimize per-frame allocations.*/private PointF viewportFocus new PointF();private float lastSpanX;private float lastSpanY;// Detects that new pointers are going down.Overridepublic boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) {lastSpanX ScaleGestureDetectorCompat.getCurrentSpanX(scaleGestureDetector);lastSpanY ScaleGestureDetectorCompat.getCurrentSpanY(scaleGestureDetector);return true;}Overridepublic boolean onScale(ScaleGestureDetector scaleGestureDetector) {float spanX ScaleGestureDetectorCompat.getCurrentSpanX(scaleGestureDetector);float spanY ScaleGestureDetectorCompat.getCurrentSpanY(scaleGestureDetector);float newWidth lastSpanX / spanX * mCurrentViewport.width();float newHeight lastSpanY / spanY * mCurrentViewport.height();float focusX scaleGestureDetector.getFocusX();float focusY scaleGestureDetector.getFocusY();// Makes sure that the chart point is within the chart region.// See the sample for the implementation of hitTest().hitTest(scaleGestureDetector.getFocusX(),scaleGestureDetector.getFocusY(),viewportFocus);mCurrentViewport.set(viewportFocus.x- newWidth * (focusX - mContentRect.left)/ mContentRect.width(),viewportFocus.y- newHeight * (mContentRect.bottom - focusY)/ mContentRect.height(),0,0);mCurrentViewport.right mCurrentViewport.left newWidth;mCurrentViewport.bottom mCurrentViewport.top newHeight;...// Invalidates the View to update the display.ViewCompat.postInvalidateOnAnimation(InteractiveLineGraphView.this);lastSpanX spanX;lastSpanY spanY;return true;} };
http://www.lebaoying.cn/news/99801.html

相关文章:

  • .ent做的网站有哪些效益成本原则网站建设
  • 美团网站网站建设发展免费logo设计在线生成器官网
  • 云南做网站公司肇庆市网站建设
  • 网站建设费用价格明细表网站建设绿茶科技
  • 网站解除域名绑定网络销售怎么才能找到客户
  • 无棣网站制作php网站开发 pdf
  • 河北省网站快速备案公众号怎么推广
  • 网站开发成都vps 网站打不开
  • 微信订阅号不认证可以做网站吗在工行网站上如何做现金理财
  • 服装网站开发的需求分析网站必备功能
  • 凡科建站是不是免费的小红书搜索优化
  • 全屏的网站wordpress qq微信登陆地址修改密码
  • 丽水市住房和城建建设局网站php网页设计作业代码
  • 网站备案号如何获得免费打广告平台有哪些
  • 盐亭网站建设天津低价网站建设
  • 音乐网站建设成本网站建设个网站一般需要花多少钱
  • 建设部考试网站班级网站html代码
  • 网站建设的学习方法免费创建单页网站
  • 做网站的模版手机优化软件哪个好用
  • 网站盗号怎么做电销做网站的话术
  • 国外网站后台模板下载百色seo外包
  • 深圳科源建设集团有限公司网站济南市工程造价信息网
  • 暴雪公司windows优化大师卸载
  • 南京市建设发展集团有限公司网站wordpress vantage主题
  • 品牌网站建设坚持大蝌蚪简单个人网站制作
  • 公司网站做的好的公司什么网站比较吸引流量
  • 潍坊云建站模板4399国语免费播放
  • 高端的网站设计公司好用的代码网站
  • 长沙正规企业网站制作平台中国企业网站
  • 广州专业的网站建设北京室内设计