| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Android LayoutTransition -> 正文阅读 |
|
[游戏开发]Android LayoutTransition |
1.LayoutTransition LayoutTransition意思是布局过渡,也就是布局动画,这个类可以实现ViewGroup的布局改变时自动执行动画。 在Android开发时经常会用到View的setVisiblity()方法来动态隐藏和显示view,但是这样是没有过渡动画的,变化的时候会显得很生硬。 LayoutTransition 从api11开始提供,主要功能就是在ViewGroup的布局发生变化时能够自动创建动画。使用的时候需要创建一个LayoutTransition实例,并调用ViewGroup的setLayoutTransition( LayoutTransition)方法。这样,每当ViewGroup添加或者删除内部view时就会触发动画。如果要设置定制的动画,需要调用setAnimator()方法。 布局动画由两种状态的改变导致执行四种不同的动画。 两种状态的改变分别是view被添加到ViewGroup(或者变得可见VISIBILITY)、view被移除ViewGroup(或者不可见)。所以设置View可见或者不可见也将触发布局动画添加和删除动画的逻辑( GONE and VISIBLE)。 四种不同的动画分别是(api11中添加): APPEARING:view被添加(可见)到ViewGroup会触发的动画。 DISAPPEARING :view被移除(不可见)ViewGroup会触发的动画。 CHANGE_APPEARING :view被添加(可见)到ViewGroup,会影响其他View,此时其它View会触发的动画。 CHANGE_DISAPPEARING:view被移除(不可见)ViewGroup,会影响其他View,此时其它View会触发的动画。 也就是说,假如ViewGroup中有多个Button对象,需要删除其中一个Button对象的话,该Button对象可以设置动画(即DISAPPEARING 动画形式),ViewGroup中的其它Button对象此时移动到新的位置的过程中也可以设置相关的动画(即CHANGE_DISAPPEARING 动画形式);若向ViewGroup中添加一个Button,Button对象可以设置动画(即APPEARIN 动画形式),ViewGroup中的其它Button对象此时移动到新的位置的过程中也可以设置相关的动画(即CHANGE_APPEARING 动画形式)。 注:PI16 添加了CHANGING 类型,表示当元素本身某个属性发生变化,但元素并没有添加和移除时需要动画的显示。所以现在是五种类型动画。 四种类型的动画都有默认的动画效果,当只为ViewGroup设置了animateLayoutChanges=true后,触发ViewGroup中view的添加和删除就会触发默认动画。默认情况下DISAPPEARING和CHANGE_APPEARING类型动画会立即执行,其他类型动画则会有延迟,这样就会导致如下效果:当一个View被添加到布局中,其他受影响的View会首先移动,接着当view添加到布局时运行appearing animation。当一个view被从布局中移除时,首先运行移除动画,接着运行其他受影响的view的动画,此时可以利用setDuration和setStartDelay修改延迟时间。 注意: ①如果在DISAPPEARING动画完成之前运行了APPEARING动画,则DISAPPEARING动画将停止,并且会恢复DISAPPEARING动画的效果。如果在APPEARING动画完成之前启动DISAPPEARING动画,则会对APPEARING动画发生一样的作用。 ②如果ViewGroup在xml文件中设置了animateLayoutChanges=true,就会有默认的布局动画,但如果在一个多层嵌套的布局中,由于布局处于多个层级的关系,这个布局动画很可能不会生效。有时CHANGE_APPEARING 和 CHANGE_DISAPPEARING动画在一个滚动的布局中,可能导致布局动画无法匹配view的实际位置导致动画看着不连贯(或者无法到准确位置),这时可以通过禁用CHANGE_APPEARING 和 CHANGE_DISAPPEARING动画解决。 ③addTransitionListener(LayoutTransition.TransitionListener):添加Layout变化监听 removeTransitionListener(LayoutTransition.TransitionListener listener):移除Layout变化监听 LayoutTransition.TransitionListener用于监听LayoutTransition的开始和结束,有两个回调: endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType):LayoutTransition某一类型动画结束 startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType):LayoutTransition某一类型动画开始 ? 2.LayoutTransition 默认动画效果 当ViewGroup在xml文件中设置了animateLayoutChanges=true,就会有默认的布局动画效果。 默认情况下DISAPPEARING和CHANGE_APPEARING类型动画会立即执行,其他类型动画则会有延迟。也就是说如果删除view,被删除的view将先执行动画消失,经过一些延迟受影响的view会进行动画补上位置,如果添加view,受影响的view将会先给添加的view腾位置执行CHANGE_APPEARING动画,经过一些时间的延迟才会执行APPEARING动画。 使用方法: ①在xml布局文件里为ViewGroup添加android:animateLayoutChanges="true" ②java中设置: ViewGroup container = (ViewGroup) findViewById(R.id.container); LayoutTransition transition = new LayoutTransition(); container.setLayoutTransition(transition); 在4.1 JellyBean上还有一个增强的功能,可以在容器内的子view的layout发生变化时也播放动画,用法如下: LayoutTransition transition = container.getLayoutTransition(); transition.enableTransitionType(LayoutTransition.CHANGING); ? 3.设置自定义布局动画 给ViewGroup添加布局动画的步骤: ①生成LayoutTransition实例LayoutTransition layoutTransition = new LayoutTransition(); ②为LayoutTransition 各个类型动画设置用户自定义动画,setAnimator()函数 ③通过ViewGroup的setLayoutTransition(layoutTransition )添加布局动画。 其中,setAnimator(int transitionType, Animator animator)参数说明: transitionType:动画类型,分为五种,分别是CHANGE_APPEARING、CHANGE_DISAPPEARING、CHANGING、APPEARING、DISAPPEARING。 animator:相应的动画。 setAnimator方法为每种布局动画设置具体的动画,可以设置ObjectAnimator或者包含属性动画的AnimatorSet。 setStagger可以设置每个子view动画的时间间隔。 ①APPEARING和DISAPPEARING 动画 APPEARING:view被添加(可见)到ViewGroup会触发的动画。 DISAPPEARING :view被移除(不可见)ViewGroup会触发的动画。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? android:id="@+id/ll_container" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? android:orientation="vertical" ? ? android:animateLayoutChanges="true"> ? ? <Button ? ? ? ? android:id="@+id/btnadd" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:layout_height="wrap_content" ? ? ? ? android:padding="5dp" ? ? ? ? android:text="添加view"/> ? ? <Button ? ? ? ? android:id="@+id/btndel" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:layout_height="wrap_content" ? ? ? ? android:padding="5dp" ? ? ? ? android:text="删除view"/> </LinearLayout> public class MainActivity extends Activity { ? ? private LinearLayout mContainer; ? ? private LayoutTransition layoutTransition; ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_main8); ? ? ? ? mContainer = findViewById(R.id.ll_container); ? ? ? ? layoutTransition = new LayoutTransition(); ? ? ? ? addCustomTransition();? ? ? ? ? ? ? ? ? ? ? ? ? ? mContainer.setLayoutTransition( layoutTransition); ? ? ? ? mBtnAdd.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onClick(View v) { ? ? ? ? ? ? ? ? Button button = new Button(this); ? ? ? ? ? ? ? ? button.setPadding(20,20,20,20); ? ? ? ? ? ? ? ? button.setText("tempBtn"); ? ? ? ? ? ? ? ? LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( ViewGroup. LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams( WRAP_CONTENT); ? ? ? ? ? ? ? ? mContainer.addView(button,2,params); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? mBtnDel.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onClick(View v) { ? ? ? ? ? ? ? ? int count = mContainer.getChildCount(); ? ? ? ? ? ? ? ? if (count >= 3){ ? ? ? ? ? ? ? ? ? ? mContainer.removeViewAt(2 ); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? private void addCustomTransition() { ? ? ? ? //移除View时view的DISAPPEARING动画 ? ? ? ? ObjectAnimator removeAnimator = ObjectAnimator.ofFloat(null, "translationX", 0, 50,0).setDuration(1500); ? ? ? ? layoutTransition.setAnimator( LayoutTransition.DISAPPEARING, removeAnimator); ? ? ? ? //添加view是view的APPEARING动画 ? ? ? ? ObjectAnimator addAnimator = ObjectAnimator.ofFloat(null, "scaleX", 0.5f, 1).setDuration(1500); ? ? ? ? layoutTransition.setAnimator( LayoutTransition.APPEARING, addAnimator); ? ? } } 添加的动画效果为每次添加view时X轴从0.5缩放到1.0,删除view是view向右移动50px后回到原点,然后消失。 ②CHANGE_APPEARING和CHANGE_DISAPPEARING CHANGE_APPEARING :view被添加(可见)到ViewGroup,会影响其他View,此时其它View会触发的动画。 CHANGE_DISAPPEARING:view被移除(不可见)ViewGroup,会影响其他View,此时其它View会触发的动画。 设置布局动画时需要注意几点: 1)CHANGE_APPEARING和CHANGE_DISAPPEARING布局动画设置必须使用PropertyValuesHolder所构造的动画才会有效果,否则不起作用。 2)PropertyValuesHolder生成动画时,”left”、”top”属性必须有,如果没有则没有动画效果。如果不需要改变这两个值,可以写成写为: PropertyValuesHolder left = PropertyValuesHolder.ofInt("left",0,0); PropertyValuesHolder top = PropertyValuesHolder.ofInt("top",0,0); 3)PropertyValuesHolder中所使用的ofInt,ofFloat中的参数值,第一个值和最后一个值必须相同,不然此属性所对应的的动画将被放弃,在此属性值上将不会有效果;同时不能所有的属性值都相同,否则也将无效(不能写成100,100,100)。 PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 100,0); 4)设置动画duration等没有效果 //为了防止动画没有效果,把left,right,top,bottom的设置都加上 PropertyValuesHolder changeLeft = PropertyValuesHolder.ofInt("left", 0, 0); PropertyValuesHolder changeTop = PropertyValuesHolder.ofInt("top", 0, 0); PropertyValuesHolder changeRight = PropertyValuesHolder.ofInt("right", 0, 0); PropertyValuesHolder changeBottom = PropertyValuesHolder.ofInt("bottom", 0, 0); //添加view时,其他受影响view动画效果 PropertyValuesHolder aniChanApp = PropertyValuesHolder.ofFloat("rotation", 0, 50, 0); ObjectAnimator changeApp = ObjectAnimator.ofPropertyValuesHolder(this, changeLeft,changeTop,aniChanApp); layoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeApp); //删除view时其他受影响view动画效果 PropertyValuesHolder aniChangeDis = PropertyValuesHolder.ofFloat("rotation", 0, 50, 0); ObjectAnimator changeDis = ObjectAnimator.ofPropertyValuesHolder(this,changeLeft,changeTop,aniChangeDis); layoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeDis); ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/16 21:35:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |