码迷,mamicode.com
首页 > 其他好文 > 详细

View入门

时间:2016-04-29 16:41:26      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

View

概述

        对于一个view,他应该有两个位置:一个是显示位置(即我们人眼看到的位置),一个是点击位置(即接收用户点击事件的位置)。

        在初始化完成后,两个位置是重合的,因此“所见即所点”。但,当调用了scrollTo(),scrollBy()或者tweens动画后,所见已经不和所点重合:所见位置发现变化,但所点还在原地。这也是属性动画和tweens动画的区别,前者仍旧保持了所见即所点。

位置

        mLeft,mTop,mBottom和mRight分别表示原始的左上角的x,y坐标,右下角的x,y坐标。它们都是相对于父组件而言的。如果控件的左上角与父控件的左上角重合,那么mLeft,mTop都是0。可以通过getLeft(),getRight(),getTop()和getBottom()获取相应的值。

        x,y,translationX和translationY。x,y分别表示View相对于其父控件的当前的左上角坐标,tranlationX和translationY为View在x,y轴上移动的距离。x = mLeft+translationX;y = mTop + translationY。

        在移动时,mLeft,mRight,mBottom与mTop是不变的,变化的只有x,y,translationX和translationY

        mScrollX与mScrollY表示显示区域一共移动的位移,它跟mLeft以及translationX等值无关。mScrollY表示点击区域的上边坐标减内容区域的上边坐标。由于scrollTo/scrollBy两个方法只改变内容区域,而点击区域并没有变化。所以scrollBy(100,0)时,意味着内容区域的左边缘要比现在的左边缘少100个像素,因此图像往左移(用户看到的永远只是内容区域,而不是点击区域)。

        可以将View的坐标分为三类:第一类mLeft等四个属性,表示View的原始坐标,一旦显示之后不可修改;第二类,在原始坐标基础上进行移动得到的新坐标,它并不能影响原始坐标,但可以改变当前位置;第三类,内容区域的坐标,即不能改变原始坐标也不能改变新坐标,只是修改内容区域的坐标。

setLeft()与LayoutParams.leftMargin的区别

        两者都可以改变mLeft的值:即改变子View在父View中的初始位置。但setLeft()只是修改了mLeft的值,不会影响其他属性mRight,mTop和mBottom的值。并且不会请求父组件重新测量,布局。

        但后者会同时修改mLeft,mRight等四个属性的值,并会引起重新测量和布局。

        对于两者来说,它们都会引起点击区域的改变,只不过前者不影响mScrollX与mScrollY的值,后者却会影响。通过LayoutParams进行修改,相当于对该控件进行重新生成,mScrollX与mScrollY会被初始化为0。

移动

        根据View的三类坐标,对View进行移动也有三种方法。

第一种,改变内容区域。有两种方式:

        1,通过scrollTo()/scrollBy()

        2,通过补间动画。其实质也是通过scrollTo()/scrollBy()。

第二种:改变点击区域。有两种方式:

        1,改变mLeft,x,y,translationX和translationY等属性的值。

        2,使用属性动画。其实质仍旧是修改上述四个属性的值。

第三种:改变初始位置。只有一种方式:

        使用LayoutParams,并修改其中的leftMargin,topMargin等几个跟margin相关的值。

比较

        第一种方式并没有修改点击区域,所以如果要移动的View有点击事件的话,需要单独进行处理。后两种不需要。

        如果想移动View在父View中的位置,第一种方法中没办法使用scrollTo/scrollBy,但可以使用动画。

layout

        layout():用于确定自己的位置。通过setFrame()方法设置mLeft,mRight,mTop和mBottom的值。

        onLayout():用于确定子View的位置。会调用子View的layout()方法。

draw

        一般不需要重写draw()方法。

        draw()的主要作用就是控件整个绘制的流程,因为即使子View重写了draw()方法也必须调用super.draw()。draw的一般过程为:

        1,绘制背景——drawBackground()

        2,绘制自己的内容——onDraw()

        3,绘制子View——dispatchDraw()

        4,绘制一些装饰性内容(前景,滚动条等)——onDrawForeground()。

常用方法

        getTop(),getLeft(),getBottom()与getRight()获取的该view在父组件中的相对位置。显示位置改变后,并不会影响该值。例如ScrollView不断滑动时,getScrollY()的值会不断变化,但getTop()的值是固定的。在ScrollView中,即使在当前该view还没有显示出来,它一样有getTop(),也就是说它的位置已经在ScrollView中摆放好了。

        scrollTo(),scrollBy():移动view的显示位置,并不移动它的点击位置。平移动画也是通过这两个方法实现的。

        getScrollX(),getScrollY():获取该view通过scrollBy()或者scrollTo()移动的总位移(这里是位移,而不距离)。

        setTranslationX():设置x轴平衡距离。与scrollTo()的区别在于,它将view的点击位置和显示位置同时移动。

        onScrollChanged():每一次调用scrollTo()后便回调该方法。例如ScrollView不断滑动时,就会一直回调该方法,不管是手指按下还是屏幕自动滚动。它的前两个参数指的是当前在水平和垂直方向的scroll位移——显示位置的移动距离;后两个参数指前一次的scroll位移。

        overScrollBy():在滚动过程中的回调,其参数非常有用(注:在魅族手机上对该方法的回调有问题,会出现乱七八糟的现象)。前两个参数为:调用该方法时,本次滚动在x,y轴上的移动距离;第三四个参数为:到调用该方法时,在x,y轴上总的滚动距离,不包括本次的滚动距离;第五六个参数为:在x,y轴上能滚动的距离,可以理解为它的内容高度减去控件自身的高度;第七八个参数为:在x,y轴上能额外滚动的距离,即超出范围后仍旧能滚动的距离。最后一个参数为:调用该方法是,是因为触摸滚动还是自动滚动。

        上面说的都是ScrollView,并不适合于ListView,因为ListView在显示时并不会将所有的View都创建好。当然对所有的View来说,onScrollChanged及scrollBy等方法的含义是一样的,因为这些方法在View类中。

        dispatchDraw()与onDraw():dispatchDraw()主要用于子View的绘制,而onDraw()用于自身的绘制。并且,dispatchDraw()在onDraw()之后调用。

        computeScroll():由父View调用。当子View更新了mScrollX或者mScrollY值时,可以在该方法中更改子view的位置。此方法一般在view需要根据手势进行移动时才重写。它在onDraw()前调用。

        onAttachedToWindow():在onDraw()前的某一时刻调用,但是也有可能在onMeasure()前调用。当view依附于window上时调用。只有该方法之后,才有可用来绘制的surfaceview(Android所有绘制的图像都是在SurfaceView上的,除了自己使用SurfaceView外)。

        onDetachedFromWindow():与onAttachedToWindow()相反,当view从window上脱落时调用。此方法之后用来绘制的SurfaceView已经不存在了。

        setWillNotDraw():如果本View不需要绘制任何内容,可以将该标记位设置为true,这样可以进行相应的优化。

滚动条相关属性         

        scrollbarFadeDuration:滚动条消失动画的持续时间。如果把该值设置的非常大,可以间接实现滚动条一直效果的效果。

        scrollbarThumbHorizontal、scrollbarThumbVertical:滚动条中滚动的图片。

        scrollbarTrackHorizontal、scrollbarTrackVertical:滚动条的滚动轨道(track),也即是滚动条的背景。

        fadeScrollbars:滚动条是否消失。false,滚动条一直存在;true,滚动条会在不使用时淡出。

        scrollbarStyle:主要用来决定滚动条的位置。有四个值:insideOverlay,insideInset与outsideOverlay,outsideInsetoutside是说滚动条一直处在view的边界,而inside代表滚动条会被padding影响,从而往里移。Overlay说滚动条覆盖在内容区域上,不增加padding的值;而inset却是增加padding值,相当于把内容区域再往里挤。示例:

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10px"
        android:scrollbarStyle="insideOverlay" >
    </ListView>
scrollbarStyle="insideOverlay"时

技术分享

scrollbarStyle="insideInset"时

技术分享

       对比上面两图可以发现,当为Overlay时,内容区域(即红色区域)距离边框(黑色)的距离是10px(ListView中设置了padding为10px);当为inset时内容区域距离边框不止10px,但是滚动条的右边距离边框是10px。

scrollbarStyle="outsideOverlay"时

技术分享

scrollbarStyle="outsideInset"时

 技术分享

       再对比四幅图可以发现:outside的时候滚动条是处于view的边缘的,而inside的时滚动条会受padding影响,从而不一定会处于边缘。

ImageView

scaleType:

参考:http://www.cnblogs.com/carmanloneliness/archive/2012/08/06/2625489.html

        center:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分;若小于,则直接将图片居中显示。

   fitXY:将图片缩放到与imageview大小相同,而且图片的长宽缩放比例不一致。如果图片比ImageView大,那么图片就会缩小到ImageView的大小;如果图片比ImageView小,那么图片就会扩大到整个ImageView。

        fitStart,fitCenter与fitEnd:将图片的长宽按同一比例进行缩放,直到使ImageView能完全包裹住图片,并且图片的某一边和ImageView对应的边长度相等。但此时并不能保证图片与组件之间没有空隙。如图片的宽要放大3倍,高要放大2倍。那么就会放大2倍,此时高刚好充满整个组件,但是宽却与两边保留的有空隙。

        centerInside:当ImageView的大小大于图片的大小时,图片居中显示,不进行任何缩放;当ImageView的大小小于图片的大小时,那么选取长宽缩小比例中的最大值进行缩小,然后居中显示,此时类似于fitCenter。

        centerCrop:将图片等比例缩放后截取图片中间的部分显示。如果ImageView大于图片的大小,那么选取长宽放大比例中的最大值进行放大;如果ImageView大于图片的大小,那么选取长宽放大比例中的最小值进行缩小。这样做的目的是保证无论图片是放大还是缩小,图片都能将ImageView全部填满不留空隙

Checkbox与RadioButton

        经常需要自定义这两种组件,也就是更换其中的图片。在更换图标之后,会发现两个都占有了一定的空白范围。

结果如下图:

技术分享

        点击其中的红框部分,一样可以勾选上复选框。这是因为系统默认的为两者带有一个透明的背景。只需要在布局文件中为它们的background属性@null即可。另外:button的值也为@null

        当然也可以采用自定义组合控件的方法,只不过比较麻烦。

具体style样式为:

    <style name="MyCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox">
        <item name="android:background">@null</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">center_vertical</item>
        <item name="android:button">@null</item>
        <item name="android:layout_marginLeft">20dp</item>
        <item name="android:drawablePadding">5dp</item>
        <item name="android:drawableRight">@drawable/activity_contactor_select_selector</item>
        <item name="android:textColor">#27415C</item>
        <item name="android:textSize">14sp</item>
        <item name="android:layout_marginTop">5dp</item>
        <item name="android:layout_marginBottom">5dp</item>
    </style>
其中drawableRight的值为一个选择器,也就是定义选中和未选中的两种样式。如下:<
    <item android:drawable="@drawable/selected" android:state_checked="true"></item>
    <item android:drawable="@drawable/no_selected" android:state_checked="false"></item>
    <item android:drawable="@drawable/no_selected"></item>

View入门

标签:

原文地址:http://blog.csdn.net/u010410408/article/details/51262560

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!