我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在Android应用中利用onTouchEvent实现一个滑动布局

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在Android应用中利用onTouchEvent实现一个滑动布局

本篇文章给大家分享的是有关怎么在Android应用中利用onTouchEvent实现一个滑动布局,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

boolean onTouch(View v, MotionVent event)

触摸事件发送到视图时调用(v:视图,event:触摸事件)
返回true:事件被完全消耗(即,从down事件开始,触发move,up所有的事件)
返回fasle:事件未被完全消耗(即,只会消耗掉down事件)

boolean onTouchEvent(MotionEvent event)

触摸屏幕时调用
返回值,同上

须知

onTouch优先级比onTouchEvent高
2、如果button设置了onTouchListener监听,onTouch方法返回了true,就不会调用这个button的Click事件

运用onTouchEvent写一个能滑动的布局

需求:

刚进入界面外层布局,自动下滑一段距离,露出内层布局。
2.外层布局可以上下滑动,并且带有透明度渐变效果,改变内边距效果。

需求分析:

显然,外层布局要默认覆盖内层布局了,这个容易。自动下滑,要用到动画,ObjectAnimator
2.外层布局要实现上下滑动,那么需要自定义,对onTouchEvent重写(核心逻辑)
代码如下:

  public class MyViewGroup extends ViewGroup {   private MyViewGroupListener listener;//接口,监听滑动事件  private int vertical = 0;//布局距离顶端距离(默认0)   public MyViewGroup(Context context) {  super(context);  }   public MyViewGroup(Context context, AttributeSet attrs) {  super(context, attrs);  }   public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {  super(context, attrs, defStyleAttr);  }   @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)  public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {  super(context, attrs, defStyleAttr, defStyleRes);  }    private int downY = 0;//按下时的点  private int slide = 0;//最终移动距离  @Override  public boolean onTouchEvent(MotionEvent event) {  switch (event.getAction()){   case MotionEvent.ACTION_DOWN:   downY = (int) event.getY();   break;   case MotionEvent.ACTION_MOVE:   slide = downY - (int)event.getY();   if(slide < 0){//下滑    vertical = listener.marginTop(Math.abs(slide));   }else if(slide > 0){//上滑    vertical = listener.marginTop(-slide);   }   break;   case MotionEvent.ACTION_UP:   if(vertical < 300){    //布局距离屏幕顶部小于300,就让布局充满整个屏幕    vertical = listener.marginTop(0);   }   break;  }  return true;  }     @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  super.onMeasure(widthMeasureSpec, heightMeasureSpec);  for (int i = 0; i < getChildCount(); i++) {   View child = getChildAt(i);   //系统测量   measureChild(child, widthMeasureSpec, heightMeasureSpec);  }  }     @Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {  int left = 0, top = 0, right = 0, bottom = 0;  for (int i = 0; i < getChildCount(); i++) {   View child = getChildAt(i);   right = left + child.getMeasuredWidth();   bottom = top + child.getMeasuredHeight();   child.layout(left, top, right, bottom);  }  }   public void setListener(MyViewGroupListener listener){  this.listener = listener;  }   interface MyViewGroupListener {    int marginTop(int slide);  } }
public class MainActivity extends AppCompatActivity implements MyViewGroup.MyViewGroupListener{     private MyViewGroup myViewGroup;    private ImageView iv1,iv2;    private RelativeLayout relativeLayout;    private ViewGroup.MarginLayoutParams params;    private float f;    private int p;   @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  myViewGroup = (MyViewGroup) findViewById(R.id.my);  myViewGroup.setListener(this);  iv1 = (ImageView) findViewById(R.id.iv1);  iv2 = (ImageView) findViewById(R.id.iv2);  relativeLayout = (RelativeLayout) findViewById(R.id.relative);  params = (ViewGroup.MarginLayoutParams) myViewGroup.getLayoutParams();  //初始化动画(自动下滑一段儿距离),我这里写死了900  ObjectAnimator animator = ObjectAnimator.ofFloat(myViewGroup,"translationY", 900);  animator.setDuration(2000);  animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {   @Override   public void onAnimationUpdate(ValueAnimator animation) {   float y = (float)animation.getAnimatedValue();   f = y/800;   p = (int) y/3;   alpha(f);   padding(p);   }  });  animator.start(); // cloud = (ImageView) findViewById(R.id.cloud);  }      @Override  public int marginTop(int slide) {  params.topMargin += slide;  myViewGroup.setLayoutParams(params);  int vertical = (900 + params.topMargin);  if(slide == 0){   //为了隐藏两张圆图,所以把Relativelayout的高度一并减除。   params.topMargin -= (vertical+relativeLayout.getHeight());   myViewGroup.setLayoutParams(params);  }  float alpha = f + (float) params.topMargin/800;//自定义一个算法  alpha(alpha);  int padding = p + params.topMargin/3;//自定义一个算法  padding(padding);  return vertical;  }     public void alpha(float alpha) {  iv1.setAlpha(alpha);  iv2.setAlpha(alpha);  }     public void padding(int padding) {  relativeLayout.setPadding(padding, 0, padding, 0);  }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:id="@+id/activity_main"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.wgl.viewgroup1.MainActivity">  <ImageView  android:id="@+id/iv"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:class="lazy" data-src="@mipmap/pic"  android:scaleType="fitXY"/>  <!--<ImageView-->   <!--android:id="@+id/cloud"-->   <!--android:layout_width="wrap_content"-->   <!--android:layout_height="wrap_content"-->   <!--android:layout_centerHorizontal="true"-->   <!--android:alpha="0.8"-->   <!--android:class="lazy" data-src="@mipmap/cloud3"-->   <!--android:clickable="true"/>-->   <com.wgl.viewgroup1.MyViewGroup  android:id="@+id/my"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:alpha="0.8"  android:layout_alignParentTop="true">  <LinearLayout   android:layout_width="match_parent"   android:layout_height="match_parent"   android:orientation="vertical">   <RelativeLayout   android:id="@+id/relative"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:orientation="horizontal">   <com.wgl.viewgroup1.CircleImageView    android:id="@+id/iv1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:class="lazy" data-src="@mipmap/iv1"    app:civ_border_width="2dp"    app:civ_border_color="@color/colorAccent"    android:layout_alignParentLeft="true"/>    <com.wgl.viewgroup1.CircleImageView    android:id="@+id/iv2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:class="lazy" data-src="@mipmap/iv2"    app:civ_border_width="2dp"    app:civ_border_color="@color/colorAccent"    android:layout_alignParentRight="true"/>   </RelativeLayout>   <LinearLayout   android:layout_width="match_parent"   android:layout_height="match_parent"   android:alpha="0.8"   android:background="@color/colorPrimary">    </LinearLayout>  </LinearLayout>   </com.wgl.viewgroup1.MyViewGroup> </RelativeLayout>

以上就是怎么在Android应用中利用onTouchEvent实现一个滑动布局,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在Android应用中利用onTouchEvent实现一个滑动布局

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在Android应用中利用onTouchEvent实现一个滑动布局

本篇文章给大家分享的是有关怎么在Android应用中利用onTouchEvent实现一个滑动布局,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、boolean onTouch
2023-05-31

android应用中怎么利用onLayout()实现一个流式布局

这期内容当中小编将会给大家带来有关android应用中怎么利用onLayout()实现一个流式布局,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在onLayout方法中有四个参数,我画了一个简单的图来分清
2023-05-31

怎么在android应用中利用ViewPager实现一个滑动翻页效果

这期内容当中小编将会给大家带来有关怎么在android应用中利用ViewPager实现一个滑动翻页效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现ViewPager的滑动翻页效果可以使用ViewPa
2023-05-31

怎么在Android应用中利用ListView实现一个监听滑动事件

怎么在Android应用中利用ListView实现一个监听滑动事件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ListView的主要有两种滑动事件监听方法,OnTouchLi
2023-05-31

怎么在Android中利用ViewPager实现一个屏幕滑动效果

本篇文章给大家分享的是有关怎么在Android中利用ViewPager实现一个屏幕滑动效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建View创建一个在之后作为fragm
2023-05-30

Android应用中怎么实现一个跟踪布局效果

这篇文章给大家介绍Android应用中怎么实现一个跟踪布局效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首页Activitypublic class TraceActivity extends AppCompatA
2023-05-31

怎么在Android应用中利用RecycleView 实现一个左滑上下分层功能

怎么在Android应用中利用RecycleView 实现一个左滑上下分层功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。独立Adapter的操作方式思路:
2023-05-31

怎么在Android中利用ListView实现一个侧滑删除功能

本篇文章给大家分享的是有关怎么在Android中利用ListView实现一个侧滑删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需求:1、listView可以侧滑item
2023-05-31

怎么在Android应用中利用RecyclerView实现一个分页滚动功能

怎么在Android应用中利用RecyclerView实现一个分页滚动功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、需求分析最近公司项目要实现一个需求要满足以下功能
2023-05-31

怎么在Android中利用DrawerLayout实现一个双向侧滑菜单

这篇文章将为大家详细讲解有关怎么在Android中利用DrawerLayout实现一个双向侧滑菜单,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。布局文件的代码:
2023-05-30

怎么在Android应用中利用CoordinatorLayout实现一个标题滚动效果

本篇文章为大家展示了怎么在Android应用中利用CoordinatorLayout实现一个标题滚动效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在Material Design里,Coordi
2023-05-31

怎么在Android应用中利用TextSwitcher实现一个上下滚动功能

本篇文章为大家展示了怎么在Android应用中利用TextSwitcher实现一个上下滚动功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 上下滚动TextSwitcher实例详解1
2023-05-31

如何在Android中利用View实现一个垂直时间轴布局

这篇文章将为大家详细讲解有关如何在Android中利用View实现一个垂直时间轴布局,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户
2023-05-31

如何在Android中利用View实现一个等级滑动条功能

这篇文章将为大家详细讲解有关如何在Android中利用View实现一个等级滑动条功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。思路: 首先绘制直线,然后等分直线绘制点; 绘制点的时候把X
2023-05-31

Android应用中怎么实现一个滑动切换页面功能

Android应用中怎么实现一个滑动切换页面功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 TabLayou 主要实现的是标题头的 滑动 这个 控件 类似于 ScrollV
2023-05-31

Android应用中的Activity跳转怎么利用滑动来实现

这篇文章给大家介绍Android应用中的Activity跳转怎么利用滑动来实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。通过手势识别器实现界面的转跳,具体内容如下1、创建 GestureDetector对象 2、创
2023-05-31

怎么在Android应用中实现一个动画效果

本篇文章给大家分享的是有关怎么在Android应用中实现一个动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android 三种动画详解帧动画一张张图片不断的切换,形成动
2023-05-31

怎么在Android应用中实现一个全局返回功能

这篇文章给大家介绍怎么在Android应用中实现一个全局返回功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路废话不多说了,说说主要的思路吧,关键的一个类就是:AccessibilityService,官方文档地址
2023-05-31

如何在Android应用中实现一个侧滑功能

本篇文章给大家分享的是有关如何在Android应用中实现一个侧滑功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现说明:通过自定义布局实现:SlidingLayout继承于
2023-05-31

怎么在Android中使用SeekBar实现一个平滑滚动效果

这篇文章将为大家详细讲解有关怎么在Android中使用SeekBar实现一个平滑滚动效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。把max改为100,progress改为50
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录