自定义View
文章平均质量分 70
淡淡的宁静
非宁静无以致远,非淡泊无以明志
展开
-
Canvas和其绘制目标小结
Canvas是一个绘制的工具,分为硬件Canvas和软件Canvas,通过使用Canvas的方法可以将点(图形)绘制到指定目标中(即通常所说的画布,canvas中持有画布的引用),绘制目标有几种,待会介绍。 Canvas的绘制指令:这些最常用的指令由一系列名为drawXXX()的方法提供。它们用来实现实际的绘制行为,例如绘制点、线、面,文字。 Canv...原创 2016-11-28 17:52:03 · 378 阅读 · 0 评论 -
控件树绘制完整流程概述
上面就是控件树绘制的流程。下面介绍一下上面的各个方法:说说最特殊的顶层View,就是ViewRootImpl#mView,他没有所谓的父控件也就没人调用dispatchDraw()去绘制他,也就不会嗲用他的draw(ViewGroup,Canvas,long)去帮他处理变换坐标。这些事都在ViewRootImpl#drawSoftware()中帮mView做了,然后再其中调用mView.dra原创 2016-11-27 00:53:13 · 648 阅读 · 0 评论 -
控件树的触摸事件派发小结
当一个触摸事件产生后,它的传递过程遵循如下顺序:Activity→Window→View。所以Activity的rootView收到一个触摸事件后,就会按照控件树的触摸事件派发流程,而事件的派发流程由ViewGroup(View)的dispatchTouchEvent(MotionEvent ev),其实dispatchTouchEvent方法在执行事件派发前,还控制确定派发目标的逻辑,在这里原创 2016-11-22 21:34:04 · 368 阅读 · 0 评论 -
ListView在ScrollView中只显示一行浅析
因为在代码中调试的时候,跟源码的行不匹配,乱了,所以没从源码找到什么原因。但是从以下测试代码可以知道,是ScrollView在给ListView传MeasureSpec的时候给SpecSize是有问题的,即ScrollView给的heightSpecSize是ListView一行的高度。我继承了ListView,重写了他的onMeasure方法,目的是改掉ScrollView传入的MeasureS原创 2016-11-22 14:06:42 · 666 阅读 · 0 评论 -
自定义简(粗)易(暴)SlidingMenu
这个代码只能配本文的布局文件使用,因为在代码中写死了是SlidingMenu里是两个TextView。大家可以参考里面的滑动实现,还有测量和布局的实现。这里采用了一个很笨的实现方案:即在整个ViewGroup向右滑动,为了保持MainView不动,我让MainView在ViewGroup向右滑动使Menu滑出时向左移动。其实可以采用只让MenuView(mSubView)动的方式去实现,只是想原创 2016-11-21 11:21:58 · 268 阅读 · 0 评论 -
关于触摸事件处理的一些辅助类和回调方法(上)
VelocityTracker类:速度追踪,用于追踪手指在滑动过程中的速度,包括水平速度和竖直方向的速度,使用方法的代码如下关于对象池设计模式看我这篇文章http://blog.csdn.net/b1480521874/article/details/53241417//VelocityTracker类使用了对象池的设计模式。从VelocityTracker对象池中获取对象Vel原创 2016-11-20 17:06:56 · 1037 阅读 · 0 评论 -
关于触摸事件处理的一些辅助类和回调方法(下)
关于触摸事件处理的一些辅助类和回调方法(上):VelocityTrackerGestureDetector:手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为。下面是使用过程:可以使用该GestureDetector来接管onTouchEvent。在自定义View中,使用GestureDetector可以这样:public MyView extends View{原创 2016-11-20 23:18:40 · 843 阅读 · 0 评论 -
View的位置参数及坐标
在一个View会有各种变量是描述坐标的,如:mLeft,mTop,mRight,mBottom。getX()和getY()的返回值,mScrollX, mScrollY,getLocationOnScreen(int[]),getLocationInWindow()。MotionEvent.getX()。MotionEvent.getRawX()。mLeft,mTop,mRight,mBott原创 2016-11-20 15:37:05 · 454 阅读 · 0 评论 -
使用自定义控件报错:Error inflate class
自定义View时,必须要有这个三个构造函数。View(Context context) //Simple constructor to use when creating a view from code View(Context context, AttributeSet attrs) //Constructor that is called when inflat转载 2016-11-15 16:07:22 · 1767 阅读 · 0 评论 -
滑动和弹性滑动小结
涉及到了变量和方法有(其实滑动除了这些方法,还有动画和改变LayoutParams来实现,但是这里先不说):View#mScrollX,View#mSrollY,View#scrollTo(int x, int y), View#scrollBy(int dx, int dy), Scroller, Scroller#startScroll(int startX, int startY, in原创 2016-11-17 22:18:10 · 800 阅读 · 0 评论 -
自定义ViewGroup应如何去使用setMeasuredDimsion(int,int)和计算其参数
protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) { boolean optical = isLayoutModeOptical(this); if (optical != isLayoutModeOptical(mParent)) {原创 2016-11-16 23:10:56 · 517 阅读 · 0 评论 -
在自定义ViewGroup应该怎样去考虑padding和margin
padding:需要在给子控件计算measureSpec时,应把ViewGroup 的padding属性考虑进去,即计算parentSize(可用最大尺寸)时减去ViewGroup的padding部分。在计算ViewGroup的尺寸时,除了把child.getMeasuredWidth/Height 加起来,还要把padding加上margin:protected void m原创 2016-11-16 22:04:33 · 1768 阅读 · 0 评论 -
在哪里如何生成view的measureSpec
答案是在onMeasure(int,int)中onMeasure(int,int){ ...... int widthMeasureSpec = getChildMeasureSpec(int parentSpec, int padding, int childParamWidth) ...... child.measure(widthMeasu原创 2016-11-16 21:03:39 · 463 阅读 · 0 评论 -
在onMeasure中获取已测量的子控件的宽高
不能使用child.getWidth();因为这个用right - left得到的,在onMeasure中都还没布局控件树,那些位置参数都为0.只能通过child.getMeasureWidth();原创 2016-11-16 15:52:38 · 2514 阅读 · 0 评论 -
不能在viewgroup及其子类的构造函数中中获取child
在构造时,即使运行完父类的构造函数,mChildren成员变量只是被初始化了,但是没有元素在里面,getChildAt(int index)是从mChildren中获取的。我也不清楚在哪里child才被添加进去。反正在onMeasure里可以了。原创 2016-11-16 15:37:02 · 446 阅读 · 0 评论 -
Android绘制时的坐标系变换
坐标系的变换就是变换前后的映射关系。只要理清这个变换关系就什么都明白了。现在从屏幕坐标系开始(即以屏幕左上角为原点的坐标系)变换到窗口坐标系:假如窗口左上角的坐标(下面都是指当前坐标系中的坐标)为(0, 20)如:坐标系平移:Canvas#translate(0, 20);则Canvas当前的坐标系是窗口坐标系(即以窗口左上角为原点)。变换的意义何在,方便我们在绘图时更加方便,如我原创 2016-11-26 17:03:12 · 3570 阅读 · 0 评论 -
Material Design Animation
切换Activity的Transition动画:需要开启如下属性:<item name="android:windowContentTransitions">true</item>如果需要设置动画切换时是否允许覆盖,即在前一个完全动画消失,后一个可以开始动画出现,即两个Activity的动画顺序关系,如果为false,则是前一个动画完全消失后,后一个才开始动...原创 2019-03-06 17:56:38 · 401 阅读 · 0 评论