android 上实现 控件平滑移动(smooth move) 研究

本文探讨了在Android平台上实现控件平滑移动的方法,主要利用FrameLayout和Animation框架。通过在FrameLayout中添加两个LinearLayout,结合ImageView和Translation Animation,实现了平滑移动效果。Android 2.2之前的动画支持包括View Animation和帧动画,而3.0后引入了Property Animation。平滑移动的关键在于使用Translate Animation改变ImageView的坐标。为了处理焦点和点击事件,需要采用监听接口来间接控制底层的控件。
摘要由CSDN通过智能技术生成


关于控件的平滑移动在国外著名网站stack overflow上有很多人问,最终也没人给个确切的回答。

在平板及基于android的智能电视上控件的平滑移动效果对用户的体验至关重要,最近研究了一下。


android 本身并没有对控件平滑移动的支持(可能有,我还不知道),实现控件的平滑移动需借助其动画框架(animation)及经过 扩展的framelayout。

首先看framelayout控件特点:

framelayout 是android布局中自检单的一个,是一个view的容器,只是简单的把每个view放在左上角,每当新添加一个view到framelayout容器时会遮挡先前添加的view。


这就给我们实现平滑移动提供了基础,我们可以在framelayout里添加两个子容器 linearlayout,一个linearlayout负责管理要添加的子控件,另一个linearlayout管理一个imageView控件,滑动时通过在此imageview上附着动画(animation)以达到平滑移动的效果。


在看android上的动画支持,android 2.2之前动画支持两种,view 动画和 帧动画,在包 android.view.animation中实现,android 3.0之后动画框架又添加了重量级动画框架property animation,在包android.animation中实现,代码位置在frmework/base/core/java/android/animation目录,对于控件平滑移动,用view动画中的一种即可

view动画 有四种,其中 tran

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Android实现控件的缩放移动功能,可以通过自定义控件并重写其onTouchEvent()方法来实现。具体步骤如下: 1. 在自定义控件类中,实现GestureDetector.OnGestureListener接口和ScaleGestureDetector.OnScaleGestureListener接口,用于监听手势事件。 2. 在onTouchEvent()方法中,将MotionEvent对象传递给GestureDetector和ScaleGestureDetector对象,分别监听手势事件。 3. 在GestureDetector的onScroll()方法中,处理手指拖动事件,计算控件移动的距离,并将其应用到控件上。 4. 在ScaleGestureDetector的onScale()方法中,处理缩放手势事件,计算控件的缩放比例,并将其应用到控件上。 5. 需要注意的是,缩放功能需要在控件的父布局中开启clipChildren属性,以保证控件可以在缩放时不会超出父布局的边界。 示例代码如下: ```java public class ZoomView extends View implements GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener { private GestureDetector mGestureDetector; private ScaleGestureDetector mScaleGestureDetector; private float mScaleFactor = 1.0f; private float mLastTouchX; private float mLastTouchY; private float mPosX; private float mPosY; public ZoomView(Context context) { super(context); mGestureDetector = new GestureDetector(context, this); mScaleGestureDetector = new ScaleGestureDetector(context, this); } @Override public boolean onTouchEvent(MotionEvent motionEvent) { mGestureDetector.onTouchEvent(motionEvent); mScaleGestureDetector.onTouchEvent(motionEvent); final int action = motionEvent.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { final float x = motionEvent.getX(); final float y = motionEvent.getY(); mLastTouchX = x; mLastTouchY = y; break; } case MotionEvent.ACTION_MOVE: { final float x = motionEvent.getX(); final float y = motionEvent.getY(); final float dx = x - mLastTouchX; final float dy = y - mLastTouchY; mPosX += dx; mPosY += dy; invalidate(); mLastTouchX = x; mLastTouchY = y; break; } } return true; } @Override public boolean onScale(ScaleGestureDetector scaleGestureDetector) { mScaleFactor *= scaleGestureDetector.getScaleFactor(); mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); invalidate(); return true; } @Override public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) { return true; } @Override public void onScaleEnd(ScaleGestureDetector scaleGestureDetector) { } @Override public boolean onDown(MotionEvent motionEvent) { return true; } @Override public void onShowPress(MotionEvent motionEvent) { } @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return true; } @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float distanceX, float distanceY) { mPosX -= distanceX; mPosY -= distanceY; invalidate(); return true; } @Override public void onLongPress(MotionEvent motionEvent) { } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.scale(mScaleFactor, mScaleFactor); canvas.translate(mPosX / mScaleFactor, mPosY / mScaleFactor); // 绘制控件内容 canvas.restore(); } } ``` 在该示例中,我们重写了onTouchEvent()方法,使用GestureDetector和ScaleGestureDetector对象分别监听拖动事件和缩放事件。在onScale()方法中,我们计算了控件的缩放比例,并在onScroll()方法中计算了控件移动距离。最后,在onDraw()方法中,我们将缩放和移动的变换应用到画布上,然后在画布上绘制控件的内容。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值