2014-10-27Android学习------布局处理(六)------26个字母的布局列表的实现-----城市列表应用程序

2022-03-07 08:31:49 浏览数 (1)

我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个CityList 源码 百度搜就知道很多下载的地方

本节学习接上篇布局学习(二) 地址:http://blog.csdn.net/u014737138/article/details/40555359

这节虽然名字叫做布局处理 但是确实源码的实现 之所以这样写,个人感觉还是这里放着比较好

首先还是看看需要弄成什么样子的:

图片的右侧的字母列表就是我们需要实现的

废话不多说了,直接看代码是怎么写的把:

1.要显示26个字母,首先这个必须要定义的:

利用String数组存储它们:

代码语言:javascript复制
String[] b = { "#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

2.要想做出这样一个效果,必须继承android.view.View类,然后使用画图功能去做出这样一个效果

得到屏幕的高度,每个字母的高度就是屏幕的高度除以字母的个数(也就是数组的长度)

每个字母的高度=屏幕的高度/字母的个数(数组的长度)

接下来就是用一个循环语句在画布Canvas上面画出这些字母

code:

public class MyLetterListView extends View {// 类必须继承View ,再继承这个类的时候,必须写构造函数,Eciplse自动提示需要你去重写它的构造函数,那么我直接去写就行了

public MyLetterListView(Context context) { super(context); // TODO Auto-generated constructor stub } public MyLetterListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyLetterListView(Context context, AttributeSet attrs) { super(context, attrs); }

这些构造函数我们不需要去管他们到底是什么意思,这里先不去分析他们,等有空我们再去讲他们,我们直接看怎么去画出那些字母的函数

当写完了构造函数之后,这个时候我们需要去重载这个类的void onDraw(Canvas canvas)函数 很重要 重点

@Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); {

// 首先我们设置画布的背景颜色是 #400000 深紫色 canvas.drawColor(Color.parseColor("#40000000")); } int height = getHeight();//得到画布的高度 其实就是屏幕的高度 int width = getWidth();//得到画布的宽度 int singleHeight = height / b.length; // 每个字母的高度=屏幕的高度/数组的长度(26个字母) for (int i = 0; i < b.length; i )//循环处理,把每个字母画到画布上面去 { paint.setColor(Color.WHITE);//设置字母的颜色为白色 paint.setTypeface(Typeface.DEFAULT_BOLD);//设置字母的面貌为默认的粗度 字有多粗 paint.setAntiAlias(true);//给Paint加上抗锯齿标志,是因为有些地方Paint是没法画的,就直接给canvas加抗锯齿,更方便

//其实这个抗锯齿很好解释,就是画布的边缘用paint画笔去画它,会出现一些波浪线吧,可以这么叫它,形状像锯齿一样,很

// 难看,所有如果加上抗锯齿的话,效果将有明显的改善 可以看下面的图来更好的说明 if (i == choose) {//choose变量的值时默认的-1 它的作用就是用户手去触摸它 它起到一个flag旗帜的作用 这里先不讲 paint.setColor(Color.parseColor("#3399ff"));//点中了就改变颜色为蓝色 paint.setFakeBoldText(true);//点中了就稍微改变字母的大小,与其他的字母有着区别 } float xPos = width / 2 - paint.measureText(b[i]) / 2;//当前的字母在画布上面的x坐标 float yPos = singleHeight * i singleHeight;//当前的字母在画布上面的y坐标 canvas.drawText(b[i], xPos, yPos, paint);//在画布上面画上文字 paint.reset();//画笔重置 } }

这段代码让我非常非常清楚的看清楚了字母列表是怎么创建的

那么接下来我们再回顾下这里面涉及到知识点:

1.画布上面的画笔对象Paint,有哪些函数呢?

Android Paint类介绍 /** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。 * * 1.图形绘制 * setARGB(int a,int r,int g,int b); * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。 * * setAlpha(int a); * 设置绘制图形的透明度。 * * setColor(int color); * 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。 * * setAntiAlias(boolean aa); * 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。 * * setDither(boolean dither); * 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 * * setFilterBitmap(boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode的设置 * * setMaskFilter(MaskFilter maskfilter); * 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 * * setColorFilter(ColorFilter colorfilter); * 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 * * setPathEffect(PathEffect effect); * 设置绘制路径的效果,如点画线等 * * setShader(Shader shader); * 设置图像效果,使用Shader可以绘制出各种渐变效果 * * setShadowLayer(float radius ,float dx,float dy,int color); * 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,

color为阴影的颜色 * * setStyle(Paint.Style style); * 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE * * setStrokeCap(Paint.Cap cap); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式 * Cap.ROUND,或方形样式Cap.SQUARE * * setSrokeJoin(Paint.Join join); * 设置绘制时各图形的结合方式,如平滑效果等 * * setStrokeWidth(float width); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 * * setXfermode(Xfermode xfermode); * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 * * 2.文本绘制 * setFakeBoldText(boolean fakeBoldText); * 模拟实现粗体文字,设置在小字体上效果会非常差 * * setSubpixelText(boolean subpixelText); * 设置该项为true,将有助于文本在LCD屏幕上的显示效果 * * setTextAlign(Paint.Align align); * 设置绘制文字的对齐方向 * * setTextScaleX(float scaleX); * 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果 * * setTextSize(float textSize); * 设置绘制文字的字号大小 * * setTextSkewX(float skewX); * 设置斜体文字,skewX为倾斜弧度 * * setTypeface(Typeface typeface); * 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等 * * setUnderlineText(boolean underlineText); * 设置带有下划线的文字效果 * * setStrikeThruText(boolean strikeThruText); * 设置带有删除线的效果 * */

2.一些具体的文本绘制函数作用是什么:

1)void android.graphics.Paint.setFakeBoldText(boolean fakeBoldText)

Parameters fakeBoldText true to set the fakeBoldText bit in the paint's flags, false to clear it.

true设定,false清除

2)抗锯齿函数的作用效果是怎么样的:paint.setAntiAlias(true);

3).调用Paint的measureText()方法取得字符串显示的宽度值

Android下可以利用 sdk 中已经提供的Paint的 measureText(String text) 方法

至此 字母列表这种现实效果就已经基本实现了,

接下来重要的工作就是可以点击 触发响应事件了 这个也是需要自己去写的 请继续关注下篇文章

0 人点赞