首页 > Android, App > Android中自定义UI的使用一些总结

Android中自定义UI的使用一些总结

2013-10-26 16:15 星期六    浏览: 1,854    绿 发表评论 阅读评论

1.焦点。 可以通过在布局的xml文件中View下面两个属性指定是否可以拥有焦点 android:focusable=”false” android:focusableInTouchMode=”false” 也可在通过View的函数setFocusable(true)和setFocusableInTouchMode(true)指定是否可以拥有焦点。系统会按照默认的最近方式去搜索焦点。如果系统的默认焦点顺序不能满足需求,比如可以使用View的setNextFocusLeftId和setNextFocusRightId函数指定左右的焦点邻居,当然亦可以指定上下或前后的焦点顺序。若是通过程序代码创建的View,其Id为NO_ID(值为-1,这时还是使用系统默认方式搜索),因此需要为View指定Id(调用View.setId函数)。

2. ScrollView可以为其指定是否有滚动条,只能通过xml布局文件中的属性来确定,如:android:scrollbars=”none”指定无滚动条显示。该属性无对应的程序函数,故不能在代码中通过API函数指定。故有此需求的ScrollView必须在xml文件声明创建,不可在代码中用new创建。若在创建自定义ScrollView时,需要通过构造函数传递额外的值为动态的参数,则可以在创建者中通过System.setProperty来指定一个属性: String str=mOptoType+”"; System.setProperty(Constants.KEY_CURRENT_OPTO_TYPE, str); 然后在自定义ScrollView中去读取: String str=System.getProperty(Constants.KEY_CURRENT_OPTO_TYPE, mOptoType+”"); mOptoType = Integer.parseInt(str); 亦可以通过setSmoothScrollingEnabled(false);指定自定义View不平滑滚动。

3.自定义ViewGroup(如继承自某个Layout类),可以在其构造函数中通过程序编码的方式,即new一个子控件,而不是通过xml文件的方式,然后通过addView将创建的子控件添加到自己的layout中。这样做的好处是,使用该自定义View控件时,直接使用该类文件即可复制过去,比较方便。而不用再去资源中找到对应的layout文件也将其复制过去。 也可以重载其onLayout函数重新为子控件进行布局,这时候需要子控件有高宽值,如自定义的子控件需重载onMeasure函数,在其中确定自己需要的高宽值,然后调用setMeasuredDimension保存起来。函数onLayout(boolean changed, int left, int top, int right, int bottom)中的left,top,right和bottom等值是该父控件在其父控件中的坐标系中的值。

4.自定义View。自定义View在其重载的onDraw函数中使用drawText绘制文字时,指定的原点坐标位于该文字字符的左下角(即y轴向上生长,x轴向右生长),而不是通常View里原点坐标是作上角(y轴向下生长,x轴向右生长)。可以使用canvas的translate平移坐标系和scale进行放大缩小绘制。

5.可以在自定义父控件中的不同区域绘制颜色,而将子控件背景色设置为透明色,这样可以为整个控件设置自定义的不规则的背景颜色。它们实际上是不同控件的叠加,而不是按照某种layout布局去指定该layout中的背景色,因而背景色区域的背景色也就不必受限于该layout。

6.当在自定义放大矢量字体,在有的手机或平板上OK,在有的手机上则会在放大的字体边缘上显示很多灰色像素,从而很模糊。无论如何通过Paint.setFlags更改参数都不见效果,但可能通过更改AndroidManifest.xml中的targetSdkVersion起作用: 将13改成14及其以上(如14,15,16,17)等放大后的字体在很多手机上会模糊,而采用13,12等值则不会存在。这个targetSdkVersion在ApplicationInfo中,可以通过Activity的getApplicationInfo().targetSdkVersion来获取。该值具体怎样影响到字体渲染(如某个标志),有兴趣的朋友可以研究一下然后告知一下。

清晰的字体

清晰的字体

 

模糊的字体

模糊的字体

7.KeyEvent和TouchEvent通常被ScrollView消耗掉,若需要在Activity中对Key和Touch两种事件的处理,通常需要重载ScollView的onKeyDown/Up和onTouchEvent,让其返回false。也就是说,Acitivy对应的View在没有消耗掉输入事件(返回true意味着消耗掉)时,该事件将继续可以由自己的Activity的对应的onKeyDown/Up和onTouchEvent进行处理,若自己的Activity消耗掉输入事件,比如返回键back键也被消耗掉,意味着系统的默认处理将被不能执行,如back键对应的程序的返回并一级级退出将不能被执行。

8.在一个实际应用中,自定义的ScrollView中包含了一个自定义的子View(一个LinearLayout,横竖都match_parent)假设叫做A,A又包含了n个竖直排列的自定义LinearLayout,假设叫做B,B中包含了水平排列的C(自定义的一个基本View,非ViewGroup)。C有焦点,当按上下箭头键移动时,C总可以有机会收到按键事件,也就是onKeyDown函数总是可以被调用,重载它总是返回false。这时,但当未到达ScrollView顶部或底部时,自定义ScrollView和其所在的Activity总是没有机会处理上下按键事件,也就是它们的onKeyDown函数总是未被调用。只有到达顶部或底部,对应的向上或向下按键才会送到Activity。因此,Android的按键事件应该没有走这样的一个流程:从子View到包含它的父View,逐级往上,再到Activity,再到系统默认处理。对于这种情况,在子View中重新new一个KeyEvent,然后调用KeyEvent的e.dispatch((Callback) this.getParent().getParent().getParent(), null, null)函数,重新分发一次事件,当然,此处也可以对事件进行转换。

本文链接地址: http://blog.redwolf-soft.com/?p=2368

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
分类: Android, App 标签: ,
  1. 本文目前尚无任何评论.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。