⑴ android 自定义view之悬浮动画
第五步:
githup地址: https://github.com/xuehuixzh/Floating-animation.git
⑵ android自定义view不随系统显示设置变大
设置属性动画改变scaleX和scaleY值。
变大变小可以用view、setScaleX和setScaleY,使用前分别设置轴心(setPivotX)。要动画而不是直接突然变大的话用属性动画,属性动画改变scaleX和scaleY值。
补间动画在这里不好用,不需要动画的话,这里可以用把其他View都gone掉更好,用线性布局和weight去1/4平分空间,gone掉别的view的时候这个就自然变大占满了或者应该播放时上面蒙层一个View专门处理播放。
⑶ Android动画之ViewPropertyAnimator(专用于view的属性动画)
属性动画对比原来的视图动画有很多的优点,属性动画可以对所有的对象做动画操作,但Android开发中需要做动画最多的还是View,如果只是对一个view做动画,很少的几个属性还行,如果是对同一个view的十几个属性同时做动画,相信属性动画的写法是比较繁琐的。ViewPropertyAnimator从名字就可以看出是专用于View的属性动画,在API12被提供。ViewPropertyAnimator专用于操作View动画,语法更加简洁,使用更加方便。
developer: https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator
如何获取ViewPropertyAnimator 对象:
ViewPropertyAnimator 没有构造函数,通过View.animate()方法可以方便的获取ViewPropertyAnimator 对象,此时获取的动画对象就专用于操作当前view。
setDuration(); //设置动画时长
setInterpolator(); //设置插值器
setStartDelay(); //设置延迟开始时间
start(); //立刻开始动画
cancel(); //取消动画
明显看到图片先往下走了一段,然后向左的动画才开始执行。
链式操作
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).translationY(300).scaleX(0.5f);
以上函数的执行,会导致相同动画的cancle,以上函数都是除了坐标相关都是以view左上角为坐标原点。
方法都比较简单,下面距几个列子:
首先利用translationX,translationXBy来区分By的意义:
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationY(300);
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationYBy(300);
translationYBy 可以多次移动View,translationY多次执行没有效果。
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).x(100).y(100);
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).rotation(270);
据观察withEndAction相当于动画开始,withStartAction相当于动画结束。
可以看到可以添加setUpdateListener监听,但无法通过这个监听函数监听到当前动画的信息,所以这个监听函数可能用处不大。
Animation动画概述和执行原理
Android动画之补间动画TweenAnimation
Android动画之逐帧动画FrameAnimation
Android动画之插值器简介和系统默认插值器
Android动画之插值器Interpolator自定义
Android动画之视图动画的缺点和属性动画的引入
Android动画之ValueAnimator用法和自定义估值器
Android动画之ObjectAnimator实现补间动画和ObjectAnimator自定义属性
Android动画之ObjectAnimator中ofXX函数全解析-自定义Property,TypeConverter,TypeEvaluator
Android动画之AnimatorSet联合动画用法
Android动画之LayoutTransition布局动画
Android动画之共享元素动画
Android动画之ViewPropertyAnimator(专用于view的属性动画)
Android动画之Activity切换动画overridePendingTransition实现和Theme Xml方式实现
Android动画之ActivityOptionsCompat概述
Android动画之场景变换Transition动画的使用
Android动画之Transition和TransitionManager使用
Android动画之圆形揭露动画Circular Reveal
Android 动画之 LayoutAnimation 动画
Android动画之视图动画的缺点和属性动画的引入
⑷ android 自定义view中怎么设置view放缩动画
有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现。
本例中,采用继承FrameLayout来实现自定义的ExpandView。下面将详细介绍各个部分来实现该类以及如何使用该自定义视图。
⑸ android 自定义view怎么实现动画
可以直接newView来得到View对象来实现代码布局。以下为示例代码:1.绝对布局AbsoluteLayoutabslayout=newAbsoluteLayout(this);setContentView(abslayout);Buttonbtn1=newButton(this);btn1.setText(”thisisabutton”);btn1.setId(1);AbsoluteLayout.LayoutParamslp1=newAbsoluteLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,0,100);abslayout.addView(btn1,lp1);2.相对布局RelativeLayoutrelativeLayout=newRelativeLayout(this);setContentView(relativeLayout);AbsoluteLayoutabslayout=newAbsoluteLayout(this);RelativeLayout.LayoutParamslp1=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);lp1.addRule(RelativeLayout.ALIGN_PARENT_TOP);lp1.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);relativeLayout.addView(abslayout,lp1);3.线性布局LinearLayoutll=newLinearLayout(this);EditTextet=newEditText();ll.addView(et);//动态添加布局的方法1.LinearLayoutll=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main1,null);setContentView(ll);LinearLayoutll2=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main2,ll);//这样main2作为main1的子布局加到了main1的根节点下//动态添加布局的方法2addView.LinearLayoutll=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main1,null);setContentView(ll);LinearLayoutll2=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main2,null);ll.addView(ll2);
⑹ android里面的WindowManager如何给view添加自定义动画
悬浮窗口就是popuwindow. activity也可以通过theme设置成悬浮形式,就像dialog
⑺ android 自定义view怎么做能提高效率
越少越好
为了加速视图,从那些调用频繁的活动中减少不必要的代码。在OnDraw()方法中开始绘制,它会给你最大的
效益。特别低,你也应该减少在onDraw()方法中的内存分配,因为任何内存分配都可能导致内存回收,这将会
引起不连贯。 在初始化或者动画之间分配对象。绝不要在动画运行时分配内存。
另一方面需要减少onDraw()方法中的开销,只在需要时才调用onDraw()方法。通常invalidate()方法会调用
onDraw()方法,因此减少对invalidate()的不必要调用。如果可能,调用它的重载版本即带有参数的invalidate()
方法而不是无参的invalidate()方法。该带参数的方法invalidate()能使draw过程更有效,以及减少对落在该矩形
区域(参数指定的区域)外视图的不必要重绘 。
⑻ Android自定义View——从零开始实现书籍翻页效果(一)
前言 :本篇是系列博客的第三篇,这次我们要研究 书籍翻页效果 。不知道大家平时有没用过iReader、掌阅这些小说软件,里面的翻页效果感觉十分的酷炫。有心想研究研究如何实现,于是网上找了找,发现这方面的教学资料非常少,所幸能找到 何明桂大大 的 Android 实现书籍翻页效果----原理篇 这样的入门博客(感谢大大 Orz),我们就以这篇博客为切入点从零实现我们自己的翻页效果。由于这次坑比较深,预计会写好几期,感兴趣的小伙伴可以点下关注以便及时收到更新提醒,谢谢大家的支持 ~
本篇只着重于思路和实现步骤,里面用到的一些知识原理不会非常细地拿来讲,如果有不清楚的api或方法可以在网上搜下相应的资料,肯定有大神讲得非常清楚的,我这就不献丑了。本着认真负责的精神我会把相关知识的博文链接也贴出来(其实就是懒不想写那么多哈哈),大家可以自行传送。为了照顾第一次阅读系列博客的小伙伴,本篇会出现一些在之前 系列博客 就讲过的内容,看过的童鞋自行跳过该段即可
国际惯例,先上效果图,本次主要实现了 基本的上下翻页效果 与 右侧最大翻页距离的限制
在看这篇博客之前,希望大家能先了解一下书籍翻页的实现原理,博客链接我已经贴出来了。通过原理讲解我们知道,整个书籍翻页效果界面分成了三个区域, A 为当前页区域, B 为下一页区域, C 为当前页背面,如图所示
书籍翻页效果的实现就是要以我们 触摸屏幕位置的坐标 为基础绘制出这三个区域,形成模拟翻页的特效。要绘制这三个区域,我们需要通过一组 特定的点 来完成,这些点的坐标需要通过两个已知的点( 触摸点 、 相对边缘角 )计算得到,下图我将各个特定点的位置和计算公式贴出来,大家对照着原理一起理解(渣画工望体谅 ╮(╯▽╰)╭ ),其中 b 点是由 ae 和 cj 的交点, k 点是由 ah 和 cj 的交点
简单总结一下, a 是触摸点, f 是触摸点相对的边缘角, eh 我们设置为 af 的垂直平分线,则 g 是 af 的中点, ab 、 ak 、 dj 是 直线 ; 曲线cdb 是起点为 c ,控制点为 e ,终点为 b 的 二阶贝塞尔曲线 ; 曲线kij 是起点为 k ,控制点为 h ,终点为 j 的 二阶贝塞尔曲线 ,区域 A 、 B 、 C 就由这些点和线划分开来。我们将这些点称为标识点,下一步就是模拟设定 a 和 f 点的位置,将这组标识点绘制到屏幕上来验证我们的计算公式是否正确,创建 BookPageView
实体类 MyPoint 用来存放我们的标识点坐标
界面布局:
在Activity中进行注册
效果如图
前文我们提到 ab 、 ak 、 dj 是 直线 ; 曲线cdb 是起点为 c ,控制点为 e ,终点为 b 的 二阶贝塞尔曲线 ; 曲线kij 是起点为 k ,控制点为 h ,终点为 j 的 二阶贝塞尔曲线 。通过观察分析得知, 区域A 是由View 左上角 , 左下角 , 曲线cdb , 直线 ab 、 ak , 曲线kij , 右上角 连接而成的区域,修改 BookPageView ,利用 path 绘制处 区域A
效果如图
区域C 理论上应该是由点 a , b , d , i , k 连接而成的闭合区域,但由于 d 和 i 是曲线上的点,我们没办法直接从 d 出发通过 path 绘制路径连接 b 点( i , k 同理),也就不能只用 path 的情况下直接绘制出 区域C ,我们需要用 PorterDuffXfermode 方面的知识“曲线救国”。我们试着先将点 a , b , d , i , k 连接起来,观察闭合区域与 区域A 之间的联系。修改 BookPageView
效果如图
我们将两条曲线也画出来对比观察
观察分析后可以得出结论, 区域C 是 由直线ab,bd,dj,ik,ak连接而成的区域 减去 与区域A交集部分 后剩余的区域。于是我们设置 区域C 画笔 Xfermode 模式为 DST_ATOP
效果如图
最后是 区域B ,因为 区域B 处于最底层,我们直接将 区域B 画笔 Xfermode 模式设为 DST_ATOP ,在 区域A、C 之后绘制即可,修改 BookPageView
效果如图
翻页可以从右下方翻自然也可以从右上方翻,我们将 f 点设在右上角,由于View上下两部分是呈 镜像 的,所以各标识点的位置也应该是镜像对应的,因为 区域B和C 的绘制与 f 点没有关系,所以我们只需要修改 区域A 的绘制逻辑,新增 getPathAFromTopRight() 方法
效果如图
之前由于测试效果没有对View的大小进行重新测量,在实现触摸翻页之前先把这个结了。重写View的 onMeasure() 方法
我们的需求是,在上半部分翻页时 f 点在右上角,在下半部分翻页时 f 则在右下角,当手指离开屏幕时回到 初始状态 ,根据需求,修改 BookPageView
在Activity中监听View的 onTouch 状态
注意,要设置 android:clickable 为 true ,否则无法监听到 ACTION_MOVE 和 ACTION_UP 状态
效果如图
到这里我们已经实现了基本的翻页效果,但要还原真实的书籍翻页效果,我们还需要设置一些限制条件来完善我们的项目
对于一般的书本来说,最左侧应该是钉起来的,也就是说如果我们从右侧翻页,翻动的距离是 有限制的 ,最下方翻页形成的曲线起点( c 点)的x坐标不能小于0(上方同理),按照这个限定条件,修改我们的 BookPageView
效果如图
至此本篇教程就告一段落了,当然还有许多功能需要继续完善,例如横向翻页、翻页动画、阴影效果等等,这些都会在后面的教程中一一解决。如果大家看了感觉还不错麻烦点个赞,你们的支持是我最大的动力~
⑼ Android自定义View(9) 《动画 插值器简介》
在Android中,我们经常会需要去绘制一些自己需要的控件,所以继承自View的自定义View就产生了。这篇文章主要介绍动画中的一些常用的插值器。关于插值器的使用这里就不再叙述了,有需要可以查看 Android自定义View(5) 《自定义View,动画篇 视图动画》 。
加速减速插值器,刚开始和结束的时候速度会比较慢,中间会加速
加速插值器,速度越来越快
减速插值器动画开始的时候速度加速到最大值,接着越来越慢
线性插值器,速率保持恒定
弹性插值器,模拟了控件来回弹跳的样子‘
初始偏移插值器,会在动画开始的时候先向前偏移然后再开始动画
结束偏移插值器,表示在结束时沿动画方向继续运动一段距离再结束动画
开始和结束均偏移,是AnticipateInterpolator和OvershootInterpolator的合体。
循环插值器,其构造函数
其实系统的插值器使用都是比较简单的,那么我们如何来自定义一个属于自己的插值器呢?首先我们来看一下LinearInterpolator的源码
在这里我们要注意有这个方法
这就是我们自定义插值器的关键了,我们需要实现Interpolator接口,并复写上述方法。该方法的input就是动画的执行进度,范围是0~1,根据动画的执行时间匀速输出,我们通过这个值来计算出动画实际的动画值,这个概念看过 Android自定义View(6) 《自定义View,动画篇 属性动画 ValueAnimator》 就可以理解了。线性插值器在这个方法中输出了input,也就是未做任何处理直接输出了,所以动画也就按0~1的进度匀速执行了。
接下来我们开始定义一个属于自己的简单的插值器,我们来直接实现动画的倒序播放
内容很简单,就是将原本0至1的输出结果,变为1至0,也就是倒序播放
接下来我们用之前的缩放例子来测试一下我们的插值器
这里我们可以看到我们原本设置的是从1缩放到0.5,实际的运行结果却是从0.5开始放大到1,所以使用了我们的插值器后成功实现了倒放,自定义的插值器成功了~
视图动画仅支持插值器的使用,但是这里我们再介绍一个Animator特有的Evaluator的用法,刚刚我们说了,自定义插值器其实就是将动画的进度在指定的时长内分成了0到1,用来表示动画执行的进度。在介绍Evaluator之前呢,我们再来看之前我们使用的ValueAnimator。
我们通过addUpdateListener来监听当前的动画值,而这个动画值与我们所设定的范围和动画的进度是有直接关系的,那么如何将我们的动画进度与具体的动画值联系到一起呢,这个时候就需要用到我们的Evaluator了。比如我们此时初始化了一个0f到500f的动画,那么我们可以自定义在0到1的动画进度内如何去返回具体的动画的值。
这里呢我们实现了最基础的线性变化的Evaluator,fraction也就是动画的进度,范围0到1,我们就在动画开始值的进度上加上跟随时间线性变化的值,所以我们在这里实现了和线性插值器一样的动画,注意TypeEvaluator的泛型要与你动画中的设定的值动画的类型一致,否则会出错。
下面我们再修改一下,把它变成瞬移,在动画执行到一半时直接放在动画结束的位置
当进度超过0.5时我们直接返回结束的动画值,否则就放在初始值不动
所以再次验证了我们的Evaluator生效啦
动画值的控制一方面可以利用插值器,另一方面Animator也可以使用Evaluator来实现各种插值器所完成的效果,所以在实际的开发中我们可以灵活运用~