当前位置: 首页 > news >正文

【Android】分别用JAVA和Kotlin实现横向扫描的动画效果

Android 横向扫描的动画可以通过使用 ViewPropertyAnimator 和 ObjectAnimator 来实现。

首先,在 XML 布局文件中创建一个 ImageView,并设置其宽度为 0dp,高度为 match_parent。然后,创建一个横向的渐变色 Drawable,并将其设置为 ImageView 的背景。最后,使用 ViewPropertyAnimator 来设置 ImageView 的宽度变化,实现横向扫描的动画效果。


具体实现步骤如下:

Java

1.在 XML 布局文件中添加 ImageView 和横向渐变色 Drawable:

<ImageView    android:id="@+id/scan_line"    android:layout_width="50dp"    android:layout_height="match_parent"    android:background="@drawable/scan_gradient" />

2.创建一个横向渐变色 Drawable,命名为 scan_gradient.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><gradientandroid:startColor="#00000000"android:endColor="#03A9F4"android:type="linear"android:angle="0"/>
</shape>

3.使用 ViewPropertyAnimator 来设置 ImageView 的宽度变化:

// 获取 ImageView
ImageView scanLine = findViewById(R.id.scan_line);// 获取屏幕宽度
int screenWidth = getResources().getDisplayMetrics().widthPixels;
Log.i(getClass().getSimpleName(), "onBindViewHolder: screenWidth = "+screenWidth);
// 设置 ViewPropertyAnimator
scanLine.animate().translationX(screenWidth) // 横向移动到屏幕右侧.setDuration(3000) // 动画时长为 3 秒.setInterpolator(new LinearInterpolator()) // 设置动画插值器.withEndAction(new Runnable() {@Overridepublic void run() {// 动画结束后,重新设置 ImageView 的宽度为 0scanLine.setTranslationX(0);scanLine.animate().setStartDelay(1000).start();}}).start();

上述代码中,使用 setDuration 方法设置动画时长为 3 秒,使用 setInterpolator 方法设置动画插值器为 LinearInterpolator,使得动画的速度保持匀速不变。使用 withEndAction 方法设置动画结束后的回调,重新设置 ImageView 的宽度为 0,并使用 setStartDelay 方法设置动画延迟 1 秒后再次启动,实现无限循环横向扫描的动画效果。

动画在Item的Adapter中时,获取宽度的方法

int screenWidth = holder.itemView.getResources().getDisplayMetrics().widthPixels;

Kotlin

  • 创建 ViewPager 和 PagerAdapter
class MyPagerAdapter(private val items: List<String>, fm: FragmentManager) : FragmentPagerAdapter(fm) {    override fun getItem(position: Int): Fragment {        return MyFragment.newInstance(items[position])    }    override fun getCount(): Int {        return items.size    }}
  • 创建 Fragment 和布局文件
class MyFragment : Fragment() {private lateinit var textView: TextViewoverride fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {val view = inflater.inflate(R.layout.fragment_my, container, false)textView = view.findViewById(R.id.text_view)return view}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val text = arguments?.getString(ARG_TEXT) ?: ""textView.text = text}companion object {private const val ARG_TEXT = "text"fun newInstance(text: String): MyFragment {val fragment = MyFragment()val args = Bundle()args.putString(ARG_TEXT, text)fragment.arguments = argsreturn fragment}}
}

fragment_my.xml 布局文件:

<TextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:textSize="24sp" />
  • 设置 ViewPager 和 PageTransformer
val viewPager = findViewById<ViewPager>(R.id.view_pager)
val items = listOf("One", "Two", "Three", "Four", "Five")
val adapter = MyPagerAdapter(items, supportFragmentManager)
viewPager.adapter = adapter
viewPager.setPageTransformer(false) { page, position ->val absPosition = abs(position)if (absPosition >= 1) {page.alpha = 0f} else {page.alpha = 1f - absPosition}
}

在这个例子中,我们使用 setPageTransformer 方法设置了一个 PageTransformer 对象,该对象实现了 transformPage 方法来控制每个页面的动画效果。在这个例子中,我们实现了一个简单的淡入淡出效果,即页面从左侧进入屏幕时逐渐变得不透明,而从右侧离开屏幕时逐渐变得透明。

相关文章:

【Android】分别用JAVA和Kotlin实现横向扫描的动画效果

Android 横向扫描的动画可以通过使用 ViewPropertyAnimator 和 ObjectAnimator 来实现。 首先&#xff0c;在 XML 布局文件中创建一个 ImageView&#xff0c;并设置其宽度为 0dp&#xff0c;高度为 match_parent。然后&#xff0c;创建一个横向的渐变色 Drawable&#xff0c;并…...

长尾词挖掘,如何选择精准的长尾词优化?

长尾词的挖掘也是一门大学问&#xff0c;它存在多种不同的方法。最常用的方法是把关键词直接放搜索引擎的搜索框搜索和使用长尾词挖掘工具这两种。 以运动水壶为例。 关键词直接放搜索引擎的搜索框搜索&#xff0c;结果如下&#xff1a; 使用长尾词挖掘工具&#xff0c;…...

Python相关环境变量配置和模拟手机app登录

【java环境变量配置】 接着&#xff0c;打开系统->高级系统设置->环境变量。新建一个JAVA_HOME C:\Program Files\Java\jdk1.8.0_201&#xff08;这里是你的安装路径&#xff0c;最好复制粘贴&#xff09; 然后在Path下添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 然后…...

c++ 11标准模板(STL) std::map(九)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…...

深入探索chatGPT插件:SceneXplain,Wolfram,和AppyPieAIAppBuilder

1. 引言 在这个日益依赖技术的世界中&#xff0c;AI插件已经成为了我们日常生活和工作的重要组成部分。在这篇博客中&#xff0c;我们将深入探索三个强大的AI插件&#xff1a;SceneXplain&#xff0c;Wolfram&#xff0c;和AppyPieAIAppBuilder&#xff0c;了解他们的功能&…...

华为OD机试真题B卷 Java 实现【停车场车辆统计】,附详细解题思路

一、题目描述 特定大小的停车场&#xff0c;数组cars[]表示&#xff0c;其中1表示有车&#xff0c;0表示没车。 车辆大小不一&#xff0c;小车占一个车位&#xff08;长度1&#xff09;&#xff0c;货车占两个车位&#xff08;长度2&#xff09;&#xff0c;卡车占三个车位&a…...

第二章:MySQL环境搭建

第二章&#xff1a;MySQL环境搭建 2.1&#xff1a;MySQL的下载、安装、配置 MySQL的四大版本 MySQL Community Server社区版本&#xff1a;开源免费、自由下载&#xff0c;但不提供官方技术支持&#xff0c;适用于大多数普通用户。MySQL Enterprise Edition企业版本&#xff1…...

生产环境之负载均衡LVS+keepalived方案(2)_LVS介绍

LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;linux内核2.6.X之后的版本默认已集成了LVS模块&#xff08;内核模块名为&#xff1a;ipvs&#xff09;&#xff0c;实现了基于传输层的请求负载均衡调度方案&#xff0c;LVS支持的工作模…...

【parsel】------- PYTHON爬虫基础4

parsel 这个库可以对 HTML 和 XML 进行解析&#xff0c;并支持使用 XPath 和 CSS Selector 对内容进行提取和修改&#xff0c;同时它还融合了正则表达式提取的功能。 内容目录 from parsel import Selector提取节点提取 class 包含 item-0 的节点 提取文本获取提取到的所有 li…...

MySQL数据库从入门到精通学习第8天(表数据的查询)

表数据的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大&#xff0c;是最常用的查询语句。他具有一个固定的格式&#xff0c;如下&#xff1a; SELECT 查询的内容 FROM 数据…...

什么是IPAM?如何使用IPAM来管理IP地址和DHCP?

在计算机网络中&#xff0c;IPAM&#xff08;IP Address Management&#xff09;是一种用于管理IP地址和DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;的工具或系统。IPAM旨在简化和集中管理IP地址分配、子网划分和DHCP配置等任务。本文将详细介绍IPAM的概…...

PCIE学习

目录 一、PCIE结构1、层次结构2、数据包TLPDLLP PCIE寄存器配置1、基址寄存器的作用2、基址寄存器的位置 三、PCIE读取数据 一、PCIE结构 1、层次结构 绝大多数的总线或者接口&#xff0c;都是采用分层实现的。PCIe也不例外&#xff0c;它的层次结构如下&#xff1a; PCIe定…...

商业智力,Social焕新|数说故事重磅发布“SocialGPT”,国内首个专注Social领域的商业大模型

AGI时代的到来&#xff0c;市场风云变幻&#xff0c;世界正在经历着一场技术革命的颠覆性洗礼。 2023年6月6日6时&#xff0c;数说故事正式对外发布数说故事“SocialGPT”&#xff0c;国内首个专注Social领域的商业大模型。数说故事“SocialGPT”大家昵称它为“社牛”大模型&a…...

STM32HAL库RS485-ModBus协议控制伺服电机

STM32HAL库RS485-ModBus协议控制伺服电机 一个月前&#xff0c;接手了一个学长的毕设小车&#xff0c;小车采用rs485通信的modbus协议驱动轮毂电机&#xff0c;与往常我学习的pwm控制电机方法大相径庭&#xff0c;在这里以这篇博客记录下该学习过程。 小车主要架构 电机型号 …...

【医学图像】图像分割系列.3 (uncertainty)

介绍几篇使用不确定性引导的医学图像分割论文&#xff1a;UA-MT&#xff08;MICCAI2019&#xff09;&#xff0c;SSL4MIS&#xff08;MICCAI2021&#xff09;&#xff0c;UG-MCL&#xff08;AIIM2022&#xff09;. Uncertainty-aware Self-ensembling Model for Semi-supervise…...

Java有线程安全的set吗?

在Java中&#xff0c;有线程安全的Set实现。一个常用的线程安全的Set实现是ConcurrentSkipListSet。ConcurrentSkipListSet是一个有序的集合&#xff0c;基于跳表(SkipList)的数据结构实现。它提供了线程安全的操作&#xff0c;并且具有较好的性能。 接下来笔者用一段简单的Jav…...

《HelloGitHub》第 86 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …...

LDGRB-01 3BSE013177R1 将数字输入和继电器输出结合

LDGRB-01 3BSE013177R1包的一部分是全面的通信选项&#xff0c;包括Modbus主/从或CS31&#xff0c;这种产品很少提供。128kB的用户内存和0.1秒/指令的程序处理时间只是AC500-eCo令人印象深刻的性能的两个例子。除了与现有AC500系列的互操作性&#xff0c;AC500-eCo系统还使用基…...

手动计算校正年龄、性别后的标准化死亡率 (SMR)

分析队列人群有无死亡人数超额&#xff0c;通常应用标准人群死亡率来校正&#xff0c;即刻观察到中的实际死亡数&#xff08;D&#xff09;与定一个标准的死亡人数&#xff08;E&#xff09;&#xff0c;D与E之比称为死亡比&#xff08;standarized Mortality ratio&#xff0c…...

Java组合模式:构建多层次公司组织架构

在现实生活中&#xff0c;常常会遇到用树形结构组织的一些场景&#xff0c;比如国家省市&#xff0c;学校班级&#xff0c;文件目录&#xff0c;分级导航菜单&#xff0c;以及典型的公司组织架构&#xff0c;整个层次结构自顶向下呈现一颗倒置的树。这种树形结构在面向对象的世…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...