View的滑动与弹性滑动(改变View的参数+属性动画)

Android View(一)——View的基础知识 目录一.View的基础知识1.什么是View2.View的位置参数3.MotionEvent4. TouchSlop5. VelocityTracker6. GestureDetector 一.View的基础知识 1.什么是View View是一种界面层的控件的一种抽象,它代表了一个控件,是Android中所有控件的基类。 2.View的位置参数 3.MotionEvent 在我们触摸屏幕的过程中,可以分为三种情况,分别是按下、滑动、弹起。Android中为我们封装好了一个MotionEvent类,使 阅读详情

自定义控件系列:
秒懂OnMeasure
秒懂OnLayout
让自定义ViewGroup里的子控件支持Margin
让自定义ViewGroup支持Padding
自定义ViewGroup的一个综合实践 FlowLayout
onDraw
最简单的自定义View:SwitchView

这次做一个SwitchView,需要使用下面的几个知识点:

知识点:

自定义View不是每次都要重写onMeasure和onLayout,为了避免手写onMeasure和onLayout,不要直接继承ViewGroup,而是继承LinearLayout、FrameLayout、RelativeLayout这种已经重写过了onMeasure和onLayout的布局

  1. 如何获取控件的宽高

    我们知道经常因为控件还没加载出来就去获取宽高,那么得到的宽高为0,使用view.post()是获取宽高最简单的方式之一(为什么呢,看了源码后,巴拉巴拉…),当然还有其他很多方法。

    post(new Runnable() {
                @Override
                public void run() {
                    mWidth = getMeasuredWidth();
                    mHeight = getMeasuredHeight();
                }
            });
    
  2. 如何动态地添加一个子控件

    我们经常需要通过代码来添加子控件,而不是写到xml里,当然是addView了
    addView(View child) 把子控件添加到末尾
    void addView(View child, int index)把子控件添加到指定位置
    addView(View child, int width, int height)把子控件添加到末尾,并为子控件指定宽高
    addView(View child, LayoutParams params)把子控件添加到末尾,子控件的宽高、margin、gravity等等所有xml里以“layout_xxx"开头的属性全部封装在LayoutParams里
    addView(View child, int index, LayoutParams params)把子控件添加到指定位置,子控件的宽高、margin、gravity等等所有xml里以“layout_xxx"开头的属性全部封装在LayoutParams里
    上面的方法都是间接或直接调用了这个方法

    可见LayoutParams也很重要

    1. 不同的ViewGroup都有自己专属的LayoutParams,对应xml里“layout_xxx"的所有属性,我们如果想使用这些属性,必须通过设置子控件的LayoutParams来实现
      下图是LinearLayout的Layout_开头的属性在这里插入图片描述

    下图是RelativeLayut以Layout_开头的属性

    在这里插入图片描述

    举个例子:在RelativeLayout里动态添加子控件

     		rl = (RelativeLayout) findViewById(R.id.rl);
            
            TextView textView = new TextView(this);
            textView.setText("我是一个textview");
            textView.setBackgroundColor(Color.RED);
            textView.setId(R.id.textview);//动态设置id,见https://www.cnblogs.com/codingblock/p/5090441.html
            RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            lp1.leftMargin = 10;
            lp1.setMargins(100, 10, 10, 10);
            lp1.addRule(RelativeLayout.CENTER_IN_PARENT);
            textView.setLayoutParams(lp1);
            rl.addView(textView);
    
    
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(R.mipmap.ic_launcher);
            RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            //★注意:这里new的是RelativeLayout.LayoutParams,因为你在为RelativeLayout添加子控件
            lp2.addRule(RelativeLayout.BELOW, R.id.textview);
            rl.addView(imageView, lp2);
    
    

    在这里插入图片描述

  3. 重写onTouchEvent,返回true,表示当前的view要处理事件(事件分发会详细说这个方法)

  4. 如何让view滑动起来

    1. 通过改变一个view的LayoutParams属性值(这里使用了margin),来实现改变view的位置
    2. 还可以通过scrollBy来实现,下篇博客举这个例子
  5. 如何实现弹性滑动,即松手后view自己平滑地移动

    1. 属性动画逐渐地改变一个属性,达到平滑移动效果
    2. scroller可以实现平滑移动

应用

效果

一个开关,滑块随着手指滑动,松手后,判断滑动位置是不是过半,过半的话平滑移动到最右侧,没过半平滑移动到最左侧
在这里插入图片描述

代码

package com.view.custom.dosometest.view;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * 描述当前版本功能
 *
 * @Project: DoSomeTest
 * @author: cjx
 * @date: 2019-12-01 10:06  星期日
 */
public class SwitchView extends LinearLayout {


    private ImageView mImageView;
    private LayoutParams mLayoutParams;
    private int mSliderHeight;
    private int mSliderWidth;
    private int mWidth;
    private int mHeight;

    public SwitchView(Context context) {
        super(context);
        init(context);
    }

    public SwitchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public SwitchView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }


    private void init(Context context) {
        setBackgroundColor(Color.GRAY);

        post(new Runnable() {
            @Override
            public void run() {
                addSlider();//因为这里需要用到控件的宽高,所以写到post里
            }
        });

    }

    private void addSlider() {
        mWidth = getMeasuredWidth();
        mHeight = getMeasuredHeight();

        mSliderWidth = mWidth / 2;
        mSliderHeight = mHeight;

		// 注意导包LayoutParams是LinearLayout.LayoutParams
        mLayoutParams = new LayoutParams(mSliderWidth, mSliderHeight);
        mImageView = new ImageView(getContext());
        mImageView.setBackgroundColor(Color.CYAN);
        mImageView.setLayoutParams(mLayoutParams);
        addView(mImageView);
    }


    float mLastX;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                mLastX = x;
                break;

            case MotionEvent.ACTION_MOVE:
                float deltaX = x - mLastX;

                // 防止滑块滑出边界,矫正deltaX
                if (mLayoutParams.leftMargin + mSliderWidth + deltaX > mWidth) {
                    deltaX = mWidth - mLayoutParams.leftMargin - mSliderWidth;
                } else if (mLayoutParams.leftMargin + deltaX < 0) {
                    deltaX = -mLayoutParams.leftMargin;
                }
				// 动态改变这个控件的左边距,实现控件的滑动
                mLayoutParams.leftMargin += (int) deltaX;
                //别忘了通过setLayoutParams,使你的改动生效
                mImageView.setLayoutParams(mLayoutParams);
                mLastX = x;
                break;


            case MotionEvent.ACTION_UP:
				// 松手后,通过属性动画改变margin实现控件的平滑移动
                if (mLayoutParams.leftMargin > mSliderWidth / 2) {
                    smoothChangeLeftMargin(mLayoutParams.leftMargin, mSliderWidth);

                } else {
                    smoothChangeLeftMargin(mLayoutParams.leftMargin, 0);

                }

                break;
        }
        return true;
    }

    /**
     * 使用属性动画平滑地过度leftMargin
     * @param start
     * @param end
     */
    private void smoothChangeLeftMargin(int start, int end) {
        ValueAnimator valueAnimator = ValueAnimator.ofInt(start, end);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mLayoutParams.leftMargin = (int) animation.getAnimatedValue();
                mImageView.setLayoutParams(mLayoutParams);

            }
        });
        valueAnimator.setDuration(300);
        valueAnimator.start();

    }
}

Android——View的事件体系(一)View的滑动 主要介绍内容: View的基础知识 View的位置参数 MotionEvent 和 TouchSlope VelocityTracker、GestureDetector 和 Scroller View的滑动 使用scrollTo/scrollBy 使用动画 改变布局参数 各种滑动方式的对比 弹性滑动 使用Scroller 通过动画 使用延时策略 View的事件分发机制 点击事件的传递规则 事 阅读详情

相关推荐

第三章-View事件体系(View的滑动、弹性滑动)

View的滑动 使用scrollTo/scrollBy 使用动画 改变布局参数 各种滑动方式的对比 弹性滑动 使用Scroller 通过动画‘ 使用延时策略 在上一节介绍了View的一些基础知识和概念,本节开始介绍很重要的一个内容:View的滑动。在Android设备上,滑动几乎是应用的标配,不管是下拉刷新还是SlidingMenu,它们的基础都是滑动。从另外一方面来说,Android手...

pin-csdn的博客 306

Android的三种动画详解(帧动画,View动画,属性动画)

设定起始和终止位置,中间会自动补齐,有平移、缩放、旋转、透明四种选择。对应的类为TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。可以使用xml配置资源文件实现,也可以用代码实现,这里用代码实现。具体为:右键点击drawable文件夹->New→Drawable Resource File。缺点:交互性差,当动画结束后会回到初始位置,对于交互性要求较高的使用属性动画。优点:效率高,使用方便。

lhm1124的博客 3516

Android View事件体系

scrollTo/scrollBy:操作简单,适合对View内容的滑动;动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果;改变布局参数:操作稍微复杂,适用于有交互的View。

2501_90328314的博客 940

View——属性动画

属性动画

刚好的博客 555

android属性动画和view动画区别的测试代码

android属性动画和view动画区别的测试代码,详见:http://blog.youkuaiyun.com/yanzi1225627/article/details/47850471

SQL Server 2025在Windows 11上的安装避坑指南

SQL Server 是微软主流关系型数据库管理系统,其安装与Windows操作系统深度耦合;Windows 11作为新一代桌面平台,强化了基于虚拟化的安全(HVCI)、驱动签名强制策略(WDAC)及内核隔离机制,导致传统数据库部署流程失效。理解二者底层交互原理,是解决服务启动失败、配置管理器无法打开、远程连接被拒等高频问题的技术前提。本文聚焦SQL Server 2025与Windows 11的兼容性挑战,覆盖系统预配置、安装节点诊断、防火墙与服务权限调优等工程实践环节,适用于高校教学、电赛备赛、中小企业

weixin_28741413的博客 322

Android自定义view之属性动画初见

序言:初到新公司,暂时工作没有那么忙,每天都在看公司的代码,在看代码以及效果的同时发现一个很大的问题,就是打开新的Activity的时候都会有一段progressDialog显示,刚开始我以为是他们自己自定义的view,后来才发现原来是帧动画实现的,LZ比较有强迫症,大量的图片汇集在一起生成一个帧动画,怎么想都觉得有点划不来,而且大量的图片处理不当的话会造成系统卡顿和OOM,加之这两天在学习属性动画

lovecyg123的博客 537

保姆级教程:用Simulink从零搭建新能源汽车VCU蠕行控制模型(附模型下载)

本文提供了一份详细的Simulink建模教程,指导读者从零开始搭建新能源汽车VCU蠕行控制模型。内容涵盖环境配置、信号定义、蠕行模式使能条件、扭矩控制算法实现及模型验证等关键步骤,特别适合需要将控制算法转化为可执行模型的初学者。教程还包含实用代码示例和常见问题解决方案,帮助开发者快速掌握VCU蠕行控制的Simulink实现技巧。

547

学习Android的第八天

Android ImageView 图像视图在 Android 中,ImageView(图像视图)是用于显示图像或者其他图形的一个常用组件。它是 Android 中的一个视图控件(View),可以在布局文件中通过 XML 或者在代码中动态创建。ImageView 的基本使用1、在xml里设置图像2、在Java代码里设置图像src属性和background属性的区别因此,可以根据需要选择适合的属性来设置图片。如果想要直接显示图像资源并保持其原始大小,可以使用 android:src;

m0_74293254的博客 2095

别再手动调参了!用BERTopic分析500篇论文摘要,我总结了这份超全参数调优指南

本文详细介绍了如何通过BERTopic参数调优从500篇论文摘要中挖掘高质量主题。从文档嵌入、降维到聚类,每个环节的关键参数设置都直接影响主题分析效果。文章提供了学术文本特有的调优技巧,包括预处理、主题多样性与专注度的平衡,以及评估指标与迭代优化方法,帮助研究者高效完成NLP主题分析任务。

weixin_31235909的博客 216

统计信号处理基础 习题解答1-1

1-1:在雷达习题中,双程延时时间的估计量具有PDF τ0~Nτ0,στ02,其中τ0是真值。假如要估计距离请提出一种估计量R,并求它的PDF。然后,确定标准偏差στ0,使得距离估计值的99%在真值的100m以内,对电磁波传播速度取c=3×108m/s。 解答: 问题1: 由于电磁波传播速度c,信号可观察的双程传播延时τ0和双程传播距离τ0满足关系: R=cτ02 因此可采用如下估计量: R=cτ02 问题2: 由于τ0满足正态分布,且: Eτ0=τ0 varτ0=στ02 那么: E

weixin_43270276的博客 2807

从零开始学Android自定义View之动画系列——属性动画(1)

相信这很出乎大家的意料吧,但事实就是如此。我们只需要告诉系统动画的运行时长,需要执行哪种类型的动画,以及动画的初始值和结束值,剩下的工作就可以全部交给系统去完成了。调用ValueAnimator的ofFloat()方法就可以构建出一个ValueAnimator的实例,ofFloat()方法当中允许传入多个float类型的参数,这里传入0和1就表示将值从0平滑过渡到1,然后调用ValueAnimator的setDuration()方法来设置动画运行的时长,最后调用start()方法启动动画。

Android 开发架构 523

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用FAAFusion傅里叶角度对齐模块改进Neck部分)

2502_91881744的博客 317

View的滑动之瞬间滑动与弹性滑动

View的滑动之瞬间滑动与弹性滑动

wjconn的博客 3265

华为海思:大小海思的双轮驱动战略分析

大海思的定位清晰明确,即专注于为华为内部提供高性能、高集成度的芯片解决方案,以支持华为终端、服务器等业务的快速发展。小海思的产品线广泛,涵盖了广域物联、短距物联、手机穿戴、显示交互、智慧视觉、智慧媒体、MCU、模拟以及光模块等多个领域。通过提供多样化的芯片解决方案,小海思旨在满足外部客户的不同需求,拓展华为海思在芯片市场的份额和影响力。大海思的产品布局主要围绕华为的内部需求展开。在智能手机应用处理器方面,大海思的麒麟系列芯片已经成为华为手机的标志性产品,以其出色的性能和能效比赢得了市场的广泛认可。

dream it possible 2926

基于 STM32 的校园电动车充电桩智能计费与过载保护系统设计与实现

本系统基于 STM32F103 主控,通过 HLW8032 电能计量芯片实现精准计费,配合继电器实现过载保护,RC522 模块完成刷卡身份识别,整体方案成本低、可靠性高,适合校园电动车集中充电场景的批量部署。软件采用状态机设计,逻辑清晰,可扩展多路充电口、远程监控等功能。

weixin_42300449的博客 62

【Android】View—基础知识,滑动,弹性滑动

在 Android 中,View是用户界面(UI)中的基本组件,用于绘制图形和处理用户交互。所有的 UI 组件(如按钮、文本框、图片等)都是View的子类。可以说,View是构建 Android 应用界面的基础。View是一种界面层的控件的一种抽象,它代表了一个控件。除了View还有ViewGroup,里面包含了许多个控件,即一组View。在Android设计中,ViewGroup也继承了View,也就意味着View本身可以是单个控件也可以是由多个控件组成的一组控件。

2301_79977698的博客 1395

RK3568适配MIPI屏幕触摸,触摸延时很大

我用的是系统,接了一个,设备树已经正确配置,evtest测试坐标值和触摸位置都是准确的。但是出现了一个:我在屏幕上点一下,要等大约 2 秒才能在evtest里看到坐标事件打印。这种现象在 Goodix 系列触摸驱动里比较少见,一般意味着。

小灰灰的博客 1363

Android进阶知识(九):View的滑动和弹性滑动

Android进阶知识(八):View的滑动和弹性滑动 Android中常见的实现View的滑动的三种方式:第一种是通过View本身提供的scrollTo/scrollBy方法来实现滑动;第二种是通过动画给View施加平移效果来实现滑动;第三种是通过改变View的LayoutParams使得View重新布局从而实现滑动。 以上提到的三种滑动方式都是非弹性滑动,无法实现渐近式滑动(弹性滑动),用户...

weixin_38196407的博客 1275

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android中View的弹性滑动——Android开发艺术探索笔记

原文链接 http://sparkyuan.me/ 转载请注明出处介绍弹性滑动也就是渐进式滑动,实现弹性滑动的方法有很多,但是他们都有一个共同的思想:将一次大的滑动分成若干次小的滑动并在一段时间内完成。本文主要介绍三种弹性滑动方式,Scroller、动画和Handler。本文中的“滑动”是指View内容的滑动而非View本身位置的改变。示例点击屏幕任意地方,手指与屏幕接触时,触发ACTION_DOW

SparkYuan 4315

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

View的事件体系(上)(View基础知识,滑动,弹性滑动)

View不是四大组件之一,但重要性堪比四大组件,本篇博文主要讲解View的事件体系,包括View的基础知识,滑动,弹性滑动,事件分发机制,滑动冲突的种类与解决方案。 一 View的基础知识 (1).View 的位置参数 View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top,left,right,bottom。从android3.0开始 View增加了额外的几个参数:x

Tyssen的博客 2467

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Kotlin进阶-5-View的滑动与动画

目录 1、View介绍 1.1、View.getTranslationX()和View.getX() 1、View介绍 在Android 中View的位置由四个属性来决定:left、top、right、bottom。 left: View 左上顶点相对于父容器的长度 top: View 左上顶点相对于父容器的高度 right: View 右下顶点相对于父容器的长度 bo...

Yo.o 1621

【Android】View滑动的实现

我们在computeScroll()内部调用 scrollTo实现滑动,之后调用postInvalidate()再次重绘,又会调用computeScroll()方法,如此反复,直到滑动结束。由上我们发现,scrollBy实际是通过调用scrollTo实现的,scrollTo是基于所传递参数的绝对滑动,而scrollBy是基于当前位置的相对滑动。Scroller是弹性滑动对象,用于实现View的弹性滑动,即有过渡效果的滑动,需要和View的computeScroll方法配合使用。

2401_87463988的博客 854

View的弹性滑动

弹性滑动,就是将一个大的滑动分成若干个小的滑动,并在一个事件段内,完成。实现方式有多种: 1.使用Scroller 对于Scroller 在View的基础知识中有过一点介绍,看一下源码,是如何实现弹性滑动的 Scroller scroller = new Scroller(mContext); //缓慢的移动到指定位置 private void smoothScrollTo(int destX,int destY){ int scrollX = getScrollX(); int deltaX

qq_34629725的博客 1908

【Android】view的基础知识

的平移滑动效果,是一种较为灵活且常用的方式。这种方法不仅可以控制滑动的距离和方向,还能够调整滑动的速度、加速度等效果,让动画更流畅和自然。是 Android 中的 UI 组件的基类,代表了用户界面上的一个可视元素。LayoutParams用于保存一个view的布局参数,我们可以通过改变view的布局参数来改变位置。可以直接对 View 的属性进行动画操作,是另一种实现弹性滑动效果的方式。是 Android 提供的一个辅助类,用于实现 View 的平滑滑动。的初始位置的偏移量,单位是像素。

Patrick_yuxuan的博客 1323
上一篇: 自定义ViewGroup的一个综合实践 FlowLayout
下一篇: View的滑动与弹性滑动(ScrollBy+Scroller)
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值