View的动画与绘制

1,#################View的坐标##########


View.getX();View.getY();得到的是view左上角坐标相对于父容器
View.getLeft(); View.getRight();View.getTop();View.getBottom();都是获取的view左上角以及右下角距离父容器的距离
View.getX = View.getTranslateX()+View.getLeft();
View.getTranslateX()是view左上角相对于容器的偏移量,
在平移过程中,即如果不是重绘Left,Top表示的是原始左上角位置信息,不变,而X,和TranslateX会变;




2.##############用户触摸扑捉辅助类#####################
GestrueDector 用于辅助检测用户的单击,双击,长按,滑动,可以接管MotionEvent








3#####################View的滑动#####################


1.~~~~~不断改变其LayoutParams ********可用于用户交互,用户拖动改变view位置
例如来电显示的改变其X,Y即左上角坐标位置,以及在设置中心指定位置,用的是iv_drag.layout(left, top, right, bottom)
RelativeLayout.LayoutParams params = (LayoutParams) iv_drag.getLayoutParams();
params.leftMargin+ = 100;
params.topMargin += 100;
iv_drag.requestLayout();
//或者iv_drag.setLayoutParams(params);内部调用requestLayout




2.~~~~利用scrollTo();scrollBy()
;****改变的是View内容的位置***,比如是LinearLayout中的TextView的位置,而不能改变LinearLayout自身的位置
scrollBy()调用了scrollTo()即在原有基础上累加,而scrollTo则是不累加滑动x100,再输入100不移动,类似于移动View

利用scrollTo()实现平移动画,改变位置,用
1.Scroller scroller = new Scroller(Context context);
2.scroller.startScroll(startX, startY, dx, dy, duration);//参数1 2分别是已经滚动的X与Y方向的距离,参数3、4分别是在X与Y方向要滚动的距离,参数5滚动时间
3.invalidate();//调用此方法会让View重绘,即会调用View的draw()方法,在draw()方法内部又会调用View.computeScroll();是个空方法需要子类实现
4.public void computeScroll(){
if(scroller.computeScrollOffset){//判断是否还有模拟数据,即平移动画没有结束
scrollTo(scroller.getCurrX(),0);
invalidate();//再次调用形成循环
}
}


3.~~~利用动画 属性动画可改变位置,一般用于不需要与用户交互时使用动画,
1.属性动画:可以设置背景颜色的改变ObjectAnimator.ofInt(view,"backgroundColor","0xFFFFFFFF","0XFF00FFFF");
1.属性动画作用的值需要提供set(),以及get()方法,用于改变值,比如translateX,view.setTranslateX(),view.getTranslateX();
2.因为属性动画的本质是改变值,所以要首先获取初始值get,再设置值set
2.当执行完View动画,如果不清除即不调用View.clearAnimation()则调用View.setVisibility()是无效的


4.~~~利用view的Visiable与InVisiable以及gone 即让相同view摆放在不同位置,根据时间,或者用户操作,来实现view的不断隐藏以及展现实现动画,
此方法可以用于解决tween动画位置无法改变问题(假象)

动画本质,方法1.2.3即是利用了不断改变View的位置,2.3做了封装,4是利用多个相同的展现动画效果,假象,即隐藏-->展现



4#####################视图#####################


控件架构 Activity ---包含-->PhoneWindow--包含-->DectorView(根view)---内部有LinearLayout-->上面是TitleView即(ActionBarContainer--包含->ActionBar),下面是FrameLayout包含的contenView






5.#####################View的绘制流程#####################


1在onMeasure获取测量的宽和高可能不准,因为系统可能多次调用measure来测量,最好在onLayout中获取测量的宽和高
measure()调用onMeasure() layout()确定本身位置 调用onLayout()确定所有子元素位置


2直接继承View或者ViewGroup的需要在OnMeasure()中对Wrap_content进行处理,不然默认是充满父布局的


3自定义View 需要考虑到padding以及margin需要手动填充到MeasureSpec中


4View本身有一些列post方法可代替handler所以尽量不要在自定义View中使用Handler


5当Activity启动后调用View.onAttachedToWindow(),包含Activity的View退出,或者移除View时,View.onDetachedFromWindow()调用,此时,View的中的子线程以及动画可以在这里结束,不然可能内存溢出


6onInterceptTouchEvent()在一系列的点击事件中不是都每次调用,但是dispachTouchEvent()是

7.measure(0,0),只忽略父布局,来测量view大小,就是Mode:UNSPECIFIED即测量模式:0 ,size =0,
7.1也可以用view.post(Runnable run)方法,在方法内部获取view的宽和高,因为view.post()是用来handler机制,等到执行post中Runnable run时已经测量完了
7.2也可以这样/*//计算出point间的距离
point.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener(){





@Override
public void onGlobalLayout() {
//当整个ViewThree完成layout回调
//因为获取point.getLeft();前提是已经layout完成才能获取到

mPointdes = ll_add_view.getChildAt(1).getLeft()-ll_add_view.getChildAt(0).getLeft();

}});*/
point.post(new Runnable(){


@Override
public void run() {
mPointdes = ll_add_view.getChildAt(1).getLeft()-ll_add_view.getChildAt(0).getLeft();
System.out.println(mPointdes);
}});
8.invalidate()方法会调用draw()方法,进行View的内容重新绘制,requestLayout();会调用系统的measure(),以及layout()方法,但是不会调用draw();


6#####################Uri#####################
Uri的schema默认有值,即content和file










7.#####################Window#####################
Window分类:应用Window(等级1-99) ,子Window(依附于父window,等级1000-1999)例如Dialog,系统Window(等级2000-2999),这三类Window分等级
系统Window的Dialog不需要依附Activity例如dialog.getWindow().setType(LayouParams.TYPE_SYSTEM_ERROR),(或者用WindowManager.LayoutParams.TYPE_SYSTEM_VOERLAY)
同时需要权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>


8.#####################ViewGroup添加LayoutAnimation#####################








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值