让每一个Activity UI都具有弹性

Android自定义控件之扫描动画UI 前言最近有一个需求,就是做一个扫描的UI,看了很多扫描动画,发现酷狗的扫描动画挺漂亮的,所以就做了一个相似的扫描动画,废话不多说,先看一下最终的效果吧。 最终效果图介绍首先我们看一下这个效果,它由以下几部分组成: 1.中间一个音符图片 2.在音符图片外面画了三个圆环 3.一个旋转的扇形动画 既然知道它的结构那就来一步一步实现它吧。准备 @Override protected 阅读详情

前面我们已经介绍了如何让你的ScrollView,ListView具有弹性,

今天,我们在前面的基础上,做一下适当的修改,让那些既不是ScrollView,也不是ListView的Activity页面,也能具有弹性。

先上图:


图中是最简单的一个Android测试程序。默认的效果TextView是无法划动的。

进过我们小小的改造,就能让整个UI具有弹性效果。

改动如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         View view = getLayoutInflater().inflate(R.layout.activity_main, null);  
  4.         view.setOnTouchListener(new ElasticTouchListener());  
  5.         setContentView(view);  
  6.     }  
我们仅仅只需要在需要弹性的Root VIew 上加上监听。就能达到如果的效果了。

ElasticTouchListener源码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class ElasticTouchListener implements OnTouchListener {  
  2.     private View inner;  
  3.     View[] children;  
  4.     private float y;  
  5.     private Rect normal = new Rect();  
  6.     private boolean animationFinish = true;  
  7.     private int[] tops;  
  8.     private int[] bottoms;  
  9.   
  10.     @Override  
  11.     public boolean onTouch(View v, MotionEvent ev) {  
  12.         if (inner == null && children == null) {  
  13.             if (v instanceof ViewGroup) {  
  14.                 ViewGroup group = (ViewGroup) v;  
  15.                 int count = group.getChildCount();  
  16.                 if (count > 0) {  
  17.                     children = new View[count];  
  18.                     tops = new int[count];  
  19.                     bottoms = new int[count];  
  20.                     for (int i = 0; i < count; i++) {  
  21.                         children[i] = group.getChildAt(i);  
  22.                         tops[i] = children[i].getTop();  
  23.                         bottoms[i] = children[i].getBottom();  
  24.                     }  
  25.                 }  
  26.             }  
  27.             inner = v;  
  28.         }  
  29.         if (animationFinish && (inner != null || children != null)) {  
  30.             int action = ev.getAction();  
  31.             switch (action) {  
  32.             case MotionEvent.ACTION_DOWN:  
  33. //              System.out.println("ACTION_DOWN");  
  34.                 y = ev.getY();  
  35.                 break;  
  36.             case MotionEvent.ACTION_UP:  
  37. //              System.out.println("ACTION_UP");  
  38.                 y = 0;  
  39.                 if (isNeedAnimation()) {  
  40.                     animation();  
  41.                 }  
  42.                 inner.invalidate();  
  43.                 break;  
  44.             case MotionEvent.ACTION_MOVE:  
  45. //              System.out.println("ACTION_MOVE");  
  46.                 final float preY = y == 0 ? ev.getY() : y;  
  47.                 float nowY = ev.getY();  
  48.                 int deltaY = (int) (preY - nowY);  
  49.                 y = nowY;  
  50.                 // 当滚动到最上或者最下时就不会再滚动,这时移动布局  
  51.                 if (isNeedMove()) {  
  52.                     if (normal.isEmpty()) {  
  53.                         // 保存正常的布局位置  
  54.                         normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());  
  55.                     }  
  56.                     if (children != null) {  
  57.                         View view = null;  
  58.                         for (int i = 0; i < children.length; i++) {  
  59.                             view = children[i];  
  60.                             view.layout(view.getLeft(), view.getTop() - deltaY / 2, view.getRight(), view.getBottom() - deltaY / 2);  
  61.                         }  
  62.                     } else {  
  63.                         // 移动布局  
  64.                         inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);  
  65.                     }  
  66.                 }  
  67.                 inner.invalidate();  
  68.                 break;  
  69.             default:  
  70.                 break;  
  71.             }  
  72.         } else {  
  73.             return false;  
  74.         }  
  75.         return true;  
  76.     }  
  77.   
  78.     // 开启动画移动  
  79.   
  80.     public void animation() {  
  81.         if (children == null) {  
  82.             // 开启移动动画  
  83.             TranslateAnimation trans = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());  
  84.             trans.setDuration(200);  
  85.             trans.setAnimationListener(new AnimationListener() {  
  86.                 @Override  
  87.                 public void onAnimationStart(Animation animation) {  
  88.                     animationFinish = false;  
  89.                 }  
  90.                 @Override  
  91.                 public void onAnimationRepeat(Animation animation) {  
  92.                 }  
  93.                 @Override  
  94.                 public void onAnimationEnd(Animation animation) {  
  95.                     inner.clearAnimation();  
  96.                     // 设置回到正常的布局位置  
  97.                     inner.layout(normal.left, normal.top, normal.right, normal.bottom);  
  98.                     normal.setEmpty();  
  99.                     animationFinish = true;  
  100.                 }  
  101.             });  
  102.             inner.startAnimation(trans);  
  103.         } else {  
  104.             for (int i = 0; i < children.length; i++) {  
  105.                 final View view = children[i];  
  106.                 if (view.getVisibility() == View.VISIBLE) {  
  107.                     final int index = i;  
  108.                     // 开启移动动画  
  109.                     TranslateAnimation trans = new TranslateAnimation(0, 0, 0, tops[i] - view.getTop());  
  110.                     trans.setDuration(200);  
  111.                     trans.setAnimationListener(new AnimationListener() {  
  112.                         @Override  
  113.                         public void onAnimationStart(Animation animation) {  
  114.                             animationFinish = false;  
  115.                         }  
  116.                         @Override  
  117.                         public void onAnimationRepeat(Animation animation) {  
  118.   
  119.                         }  
  120.                         @Override  
  121.                         public void onAnimationEnd(Animation animation) {  
  122.                             view.clearAnimation();  
  123.                             // 设置回到正常的布局位置  
  124.                             view.layout(view.getLeft(), tops[index], view.getRight(), bottoms[index]);  
  125.                             normal.setEmpty();  
  126.                             animationFinish = true;  
  127.                         }  
  128.                     });  
  129.                     view.startAnimation(trans);  
  130.                 }  
  131.             }  
  132.         }  
  133.   
  134.     }  
  135.   
  136.     // 是否需要开启动画  
  137.     public boolean isNeedAnimation() {  
  138.         return !normal.isEmpty();  
  139.     }  
  140.   
  141.     // 是否需要移动布局  
  142.     public boolean isNeedMove() {  
  143. //      int offset = inner.getMeasuredHeight() - getHeight();  
  144. //      int scrollY = getScrollY();  
  145. //      if (scrollY == 0 || scrollY == offset) {  
  146. //          return true;  
  147. //      }  
  148. //      return false;  
  149.           
  150. //      if (children != null && children.length > 0  
  151. //              && (children[children.length - 1].getBottom() <= inner.getPaddingTop()/*inner.getTop()*/  
  152. //              || children[0].getTop() >= inner.getHeight()  
  153. //              )) {  
  154. //          return false;  
  155. //      }  
  156.           
  157.         return true;  
  158.     }  
  159. }  

本次教程就到此,

经过有弹性的ScrollView,有弹性的ListView,以及本文的介绍,就可以让你的Android应用在每一个角落都拥有弹性啦。

Win11下高效管理JDK1.8与JDK17双环境的实战指南 本文提供了一份在Windows 11系统上高效管理JDK 1.8与JDK 17双环境的实战指南。文章详细讲解了如何实现双版本切换,包括如何干净安装两个JDK、通过巧妙配置环境变量实现命令行一键切换,以及在不同IDE和构建工具中为项目独立配置JDK版本,旨在帮助Java开发者彻底解决版本冲突问题,提升开发效率。 阅读详情

相关推荐

完美解决LBP2900打印机安装驱动提示无法识别USB及连接错误等问题(附Win11全新安装支持及卸载方案)

LBP2900打印机虽然经典老旧,但在Win11上依然可以完美使用!许多网上教程都无视安装失败后的问题,在此分享一种全新、100%有效的方法来解决驱动连接错误和无法识别USB设备的问题。无论是新安装还是卸载重装,这个方法都适用。本文整合了通用驱动包,支持Win2000到Win11系统,操作简单,轻松摆脱安装困扰,享受无忧打印体验!

心开始の未来~的博客 2万+

Android 自定义控件和动画

优快云启舰大神的Android自定义控件三部曲

随风的博客 1062

Keil-C51 与 Keil -ARM 共存的方法

本篇为《嵌入式相关》系列博客的第五篇,该系列博客主要记录单片机开发及硬件设计的相关过程,方便以后查阅。 Keil-C51 与 Keil -ARM 共存的方法状况解决方案1测试解决方案2 状况 今天装完Keil-C51,然后又换装了Keil-ARM之后,可以正常编译STM32 的工程,但是无法编译C51的工程,并且出现了如下错误: *** Error: Project ‘template’ requires ‘C51’ Toolchain which is not installe 这种情况就是Keil-

梁小憨憨的博客 1万+

Android自定义控件与动画的使用

控件是android开发过程中必不可少的部分,官方本身也给我们提供了许多的控件以供我们使用。但是有的时候已有控件并不能满足我们的需求,所以这个时候就需要我们自己来自定义控件。如果我们要学习自定义控件的话,我们需要去学习view的绘制过程这方面的知识,如果你需要为你的控件加上动画的话,你还需要学习android动画方面的知识,在这个过程中你可能还要学习一下android分发机制。

qq_35700731的博客 3984

python指纹识别算法(亲测代码可用)

python指纹识别算法

2301_76482796的博客 3079

保姆级教程:用CellOracle 0.10.13从单细胞数据构建基因调控网络(附完整代码)

本文提供了一份详细的CellOracle 0.10.13使用指南,帮助用户从单细胞数据构建基因调控网络。通过Python接口,即使是生物信息学新手也能快速掌握数据准备、KNN插补、GRN计算及可视化等关键步骤。文章包含完整代码和实用技巧,助力单细胞转录组数据分析。

weixin_42563415的博客 724

Android 控件Button属性方法

#ANDROID控件 Button属性方法 Bunttond是在人机交互是使用较多的组件,当用户进行某些选择的时候,可以通过Button的操作来接受用户的选择。 Button的组件层次关系如下: java.lang.Object android.view.View android.widget.TextView android.widget.Button ##Button组...

zt336611的博客 767

ENSP从下载到运行:用虚拟机搭建华为认证实验环境全流程(含USG6000V镜像配置)

本文提供了一份详细的华为ENSP仿真平台从下载、安装到配置USG6000V防火墙镜像的完整指南。内容涵盖前置软件安装、ENSP主程序配置、核心设备镜像导入及虚拟机资源分配策略,旨在帮助网络工程师和学习者快速搭建一个稳定、功能齐全的华为认证实验环境,为备考和模拟企业网络部署打下坚实基础。

weixin_29230865的博客 535

Android自定义控件_让每一个Activity UI都具有弹性

前面我们已经介绍了如何让你的ScrollView,ListView具有弹性, 今天,我们在前面的基础上,做一下适当的修改,让那些既不是ScrollView,也不是ListView的Activity页面,也能具有弹性。 先上图: \ 图中是最简单的一个Android测试程序。默认的效果TextView是无法划动的。 进过我们小小的改造,就能让整个UI具有弹性效果。 改动如下: [java

805

别再手动建模了!用Simscape Multibody Link一键导入SolidWorks装配体到Simulink

本文介绍了如何利用Simscape Multibody Link插件将SolidWorks装配体一键导入Simulink,实现CAD到仿真的无缝衔接。该技术显著提升机械系统设计与控制效率,特别适用于工业机器人、车辆悬架等复杂机构的动力学分析。文章详细解析了插件安装、模型导出优化及仿真验证的全流程,帮助工程师摆脱手动建模的低效工作模式。

weixin_27256197的博客 461

PCIE的MSI中断处理机制与优化策略

PCIe设备的。

xiaoheshang_123的博客 518

Android自定义控件(四)——让每一个Activity UI都具有弹性

前面我们已经介绍了如何让你的ScrollView,ListView具有弹性, 今天,我们在前面的基础上,做一下适当的修改,让那些既不是ScrollView,也不是ListView的Activity页面,也能具有弹性。 先上图: 图中是最简单的一个Android测试程序。默认的效果TextView是无法划动的。 进过我们小小的改造,就能让整个UI具有弹性效果。 改动如下: pro

简单随心的Android之旅 3652

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6863

让Activity UI普通控件具有弹性效果(一)

一、定义监听器 package test.xzy.com.test1.listener; import android.graphics.Rect; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.Ani

记录移动开发相关的知识 781

IMSL CNL 7.0.0 (x86-64)Crack

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

让Activity UI普通控件具有弹性效果(二)

在这篇文章中,使用了自定义的一个类来实现弹性UI的效果,我测试发现效果在屏幕控件比较多的情况下还是不尽如人意,因此,有了这一篇文章的产生。这个文章中的代码借鉴了网络上的大神代码,来更加灵活的实现弹性效果,甚至不需要修改任何java代码,只需要自定义一个类继承自ScrollView,并且在布局文件中引用该标签即可。 下面给出实现步骤和使用步骤: 1.定义一个类,并继承自ScrollVie

记录移动开发相关的知识 787

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ElasticViews:打造Android弹性触摸效果的终极指南

ElasticViews是一款专为Android开发者设计的强大库,提供了一种简单易用的方式来为应用界面添加流畅自然的弹性触摸效果。无论是按钮、卡片还是图片,通过ElasticViews都能轻松实现按压时的缩放反馈,让你的应用交互体验瞬间提升一个档次。 ## 为什么选择ElasticViews? 在移动应用设计中,触摸反馈是提升用户体验的关键因素之一。传统的点击效果往往显得生硬,而弹性触摸效果

gitblog_00254的博客 798

让Activity UI普通控件具有弹性效果(三)

SlidingLayout是一种Android平台的View控件,可以帮助你实现类似微信网页浏览的下拉功能,也可以帮助你实现类似iOS中UITableView的下拉上拉弹跳的果冻效果。 SlidingLayout完美兼容Android自带库和兼容库的所有View组件,包括RecyclerView、ListView、ScrollView以及WebView等等。 SlidingLayout

记录移动开发相关的知识 651

ElasticViews核心组件全解析:从Button到Layout的5种弹性视图

ElasticViews是一款专为Android开发者打造的弹性触摸效果实现库,通过简单集成即可为应用界面添加生动的按压反馈。本文将详细介绍5种核心弹性视图组件的特性与应用场景,帮助开发者快速掌握弹性交互设计的实现方法。 ## 1. 基础交互组件:ElasticButton 作为最常用的交互控件,ElasticButton为普通按钮添加了细腻的弹性缩放效果。在布局文件中通过自定义属性可轻松配置

gitblog_01039的博客 231

写一个上下拉动到底时有弹性的listview

在ios中的tabview功能类似于android中的listview,不过ios中的tabview具有弹性,在控件滚动到顶部或底端后会继续往上或向下滑动一段距离,感觉很有亲和力,很传神,其实在android中做到这样的效果很简单,重写listview 的overScrollBy方法就好, 效果图: TestListview.java package com.exampl

chuyouyinghe的专栏 497

ElasticViews高级技巧:自定义弹性参数与动画监听实战

ElasticViews是一款为Android应用提供弹性触摸效果的实用库,通过简单配置即可为按钮、卡片等视图添加生动的按压反馈。本文将深入探讨如何自定义弹性参数和实现动画监听,帮助开发者打造更具个性化的交互体验。 ## 一、弹性参数自定义:打造专属触摸反馈 ### 1.1 核心参数配置方法 ElasticViews提供了丰富的弹性参数调整接口,通过`ElasticAnimation`类可以轻

gitblog_00913的博客 339

Plaid自定义控件教程:打造拖拽弹性关闭的FrameLayout,5步掌握实现套路

Plaid 是一款经典的 Android 设计资讯应用,也是 Material Design 实践的标杆项目。其中 `ElasticDragDismissFrameLayout` 是一个"拖拽弹性关闭"自定义控件:页面跟着手指走、越拉越费劲(弹性阻尼),拉过阈值就自动关闭页面,没拉够则平滑回弹。本文将它拆解为 5 个步骤,帮你掌握这类自定义控件的完整实现套路 💪 ## 🧩 第 1 步:理解原

gitblog_00156的博客 816

仿微信朋友圈的可支持多点触摸的弹性滑动Scrollview

弹性滑动scrollview,支持多点触摸的接力型下拉滑动,动画回弹。 package com.aiyuba.uiview; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet...

weixin_38282516的博客 242
上一篇: 一个很棒的 线程池+缓存 示例
下一篇: Android UI 设计之 TextView EditText 组件属性方法最详细解析
Enbiting
博客等级 码龄18年 19粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值