Android view随触碰滑动效果
程序员文章站
2023-12-18 12:50:52
主要思路是通过父布局的ontouch(),方法,获取滑动到的位置和点击下的位置,再去设置子view的位置。我的代码中考虑了在边缘情况。需要注意的是,使用relativela...
主要思路是通过父布局的ontouch(),
方法,获取滑动到的位置和点击下的位置,再去设置子view的位置。我的代码中考虑了在边缘情况。需要注意的是,使用relativelayout,以imageview为例。从测试结果来看,bottommargin 和rightmargin 性能非常差,最好还是用leftmargin与topmargin定位。
下面是运行效果:
布局文件里面就是一个relativelayout中有一个imageview。如下
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/relativelayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.xingyi.moveviewwithtouch.mainactivity"> <imageview android:id="@+id/imageview" android:layout_width="40dp" android:layout_height="40dp" android:background="@android:color/black"/> </relativelayout>
java代码如下,这里考虑了边缘位置滑动的效果。如果考虑,在最左边缘imageview会有一半在屏幕之外,在最右边缘会缩小,直到看不见。
package com.xingyi.moveviewwithtouch; import android.os.bundle; import android.support.v7.app.appcompatactivity; import android.view.motionevent; import android.view.view; import android.widget.imageview; import android.widget.relativelayout; public class mainactivity extends appcompatactivity { imageview imageview; relativelayout relativelayout; int heightrl,widthrl; int halfheight,halfwidth; boolean first=true; private int widthimg; private int heightimg; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); } //初始化视图 private void initview() { imageview = (imageview) findviewbyid(r.id.imageview); relativelayout = (relativelayout) findviewbyid(r.id.relativelayout); //获取滑动瞬间位置和点击瞬间位置,并移动imageview relativelayout.setontouchlistener(new view.ontouchlistener() { @override public boolean ontouch(view view, motionevent motionevent) { switch (motionevent.getaction()) { case motionevent.action_move: moveview(imageview, motionevent.getx(), motionevent.gety()); break; case motionevent.action_down: getwidthandheight(); moveview(imageview, motionevent.getx(), motionevent.gety()); break; default: break; } return true; } }); } //因为不能在初始化视图时获得长宽,而每次计算一次长宽又影响性能 private void getwidthandheight(){ if(first){ widthrl=relativelayout.getwidth(); heightrl=relativelayout.getheight(); widthimg=imageview.getwidth(); heightimg=imageview.getheight(); halfwidth = imageview.getwidth() / 2;//imageview宽度的一半 halfheight = imageview.getheight() / 2;//imageview高度的一半 first=false; } } //滑动瞬间,将x和y分别作imageview的中心点到relativelayout最左和顶端距离 private void moveview(view view, float x, float y) { relativelayout.layoutparams params = (relativelayout.layoutparams) view.getlayoutparams(); //设置水平位置 if (x < halfwidth) {//左边缘 params.leftmargin = 0;//设置imageview到左端距离为0 } else if (x > widthrl- halfwidth) { params.leftmargin = widthrl-widthimg;//设置imageview左端到左端端距离(params.rightmargin的性能非常糟糕) } else { params.leftmargin = (int) (x - halfwidth);//imageview左端到relativelayout左端距离 } //设置竖直位置 if (y < halfheight) { params.topmargin = 0; } else if (y > heightrl - halfheight) { params.topmargin = heightrl-widthimg;//params.bottommargin的性能非常糟糕 } else { params.topmargin = (int) (y - halfheight); } view.setlayoutparams(params); } }
总结
以上所述是小编给大家介绍的android view随触碰滑动效果,希望对大家有所帮助