RemoteViews简单介绍
RemoteViews表示一个View结构,可以在其他进程中显示,由于在其他进程中显示,RemoteViews提供了一组基础的操作用于跨进程显示它的显示。
使用场景:通知栏和桌面小部件
通知栏通过NotificationManager的notify方法来实现。
桌面小部件由AppWidgetProvider来实现,AppWidgetProvider本质上是一个广播。
PendingIntent是一种特定的Intent,这个Intent中包含的意图必须由用户触发。
桌面小部件创建的步骤:
1.定义小部件界面
2.定义小部件配置信息(res/xml/…..xml)配置初始化布局,尺寸,自动更新周期
3.定义小部件的实现类,继承自AppWidgetProvider
4.在AndroidManifest.xml中声明小部件
AppWidgetProvider常用的方法有onUpdate/onEnable/onDisabled/onDeleted/onReceive。
在onReceive中根据不同的action来执行不同的方法。
onEabled:窗口小部件第一次添加到桌面上调用。
onDisabled:最后一个该类型的小部件被删除时调用。
onUpdate:周期性更新小部件
onDeleted:每删除一次小部件就调用一次。
onReceive:用于事件的分发处理。
PendingIntent简单介绍
匹配规则是:如果两个PendingIntent的内部Intent相同并且requestCode也相同,那么这两个PendingIntent就相同。
RemoteViews的简单介绍
用于在其他进程中显示并更新View界面。在使用RemoteViews中通过一系列set方法来完成对View元素的访问。大部分set方法是通过反射来完成的。
RemoteViews内部有一个mActions成员,是一个ArrayList,外界每调用一次set方法,RemoteViews就会为其创建一个Action对象并加入到ArrayList中。这里仅仅是把Action对象保存起来了,未对View进行处理。Action对象的apply方法才是真正操作View的地方。
RemoteViews的apply方法和reapply方法的区别在于apply会加载布局并更新界面,而reApply则会更新界面。
Drawable简单介绍
常见的有BitmapDrawable/ShapeDrawable/LayerDrawable/StateListDrawable。
Android动画介绍
动画可以分为三种:View动画,帧动画和属性动画。
View动画:
TranslateAnimation/ScaleAnimation/RotateAnimation/AlphaAnimation。
对应的标签:
translate:
android:fromXDelta
android:toXDelta
android:fromYDelta
android:toYDelta
scale:
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
android:pivotX
android:pivotY
rotate:
android:fromDegree
android:toDegree
android:pivotX
android:pivotY
alpa:
android:fromAlpha
android:toAlpha
使用方法:
//加载xml布局中的动画
Animation animation = AnimationUtils.loadAnimation(this,R.anim.xxx);
mView.startAnimation(animation);
//使用代码编写
AlphaAnimation anmiation = new AlphaAnimation(0,1);
animation.setDuration(300);
mView.startAnimation(animation);
自定义动画需要重写initialize和applyTransformation方法。可以采用Camera来简化矩阵变化过程。
帧动画:
通过xml定义一个AnimationDrawable。然后在代码中调用方式如下:
mView.setBackgroundDrawable(R.drawable.xxx);
AnimationDrawable drawable = (AnimationDrawable)mView.getBackground();
drawable.start();
通过LayoutAnimation可以为ViewGroup中的子元素加载时添加动画效果。可以通过android:layoutAnimation属性来加载动画效果,也可以通过LayoutAnimationController来实现。
通过overridePendingTransition()方法来可以改变Activity的切换效果。该方法必须位于startActivity或者finish之后。
通过FragmentTransaction中的setCustomAnimations()方法可以为Fragment添加动画切换效果。
属性动画简单介绍
属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用set方法。随着时间的推移,所传递的值越来越接近最终的值。
涉及到ValueAnimator、ObjectAnimator、AnimatorSet方法。
ObjectAnimator:
ObjectAnimator.ofFloat(object,"translationX",-object.getWidth()).start();
ValueAnimator:(改变一个View的背景色属性)
ValueAnimator colorAnim = ObjectAnimator.ofInt(this,"backgroundColor",0xFFFF3333,0xFFFF0000);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
AnimatorSet:
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(view,"rotationX",0,180),
ObjectAnimator.ofFloat(view,"rotationY",0,180),
......);
set.setDuration(3000).start();
//在代码中进行调用
AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimator(myContext,R.anim.xxx);
set.setTarget(mView);
set.start();
属性动画监听器主要有AnimatorUpdateListener、AnimatorListener两个接口。
插值器和估值器
TimeInterpolator:时间插值器
根据时间的流逝百分比来计算出当前属性改变的百分比。
TypeEvaluator:类型估值算法
根据当前属性改变的百分比来计算改变后的属性值。
自定义插值器需要实现Interpolator或者TimeInterpolator。
自定义估值算法需要实现TypeEvaluator。
Window和WindowManager
单击事件由Window传递给DecorView,然后再由DecorView传递给我们的View。
Window有三种类型:应用Window、子Window、系统Window。Window是分层的,层级大的会覆盖在层级小的Window之上。
WindowManager常用的三个方法:添加View、更新View、删除View。这三个方法定义在ViewManager中。WindowManager是一个接口,真正实现类是WindowManagerImpl类。WindowManagerImpl将所有的操作全部委托给WindowManagerGlobal来实现。