android单实例运行方法(5)

2019-03-22 16:59

象。 void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) //在路径上绘制文本,相对于上面第二个参数是Path路径对象 从上面来看我们可以看出Canvas绘制类比较简单同时很灵活,实现一般的方法通常没有问题,同时可以叠加的处理设计出一些效果,不过细心的网友可能发现最后一个参数均为Paint对象。如果我们把Canvas当做绘画师来看,那么Paint就是我们绘画的工具,比如画笔、画刷、颜料等等。 Paint类常用方法: void setARGB(int a, int r, int g, int b) 设置Paint对象颜色,参数一为alpha透明通道 void setAlpha(int a) 设置alpha不透明度,范围为0~255 void setAntiAlias(boolean aa) //是否抗锯齿 void setColor(int color) //设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义

.

void setFakeBoldText(boolean fakeBoldText) //设置伪粗体文本 void setLinearText(boolean linearText) //设置线性文本 PathEffect setPathEffect(PathEffect effect) //设置路径效果 Rasterizer setRasterizer(Rasterizer rasterizer) //设置光栅化

Shader setShader(Shader shader) //设置阴影 void setTextAlign(Paint.Align align) //设置文本对齐

void setTextScaleX(float scaleX) //设置文本缩放倍数,1.0f为原始 void setTextSize(float textSize) //设置字体大小

Typeface setTypeface(Typeface typeface) //设置字体,Typeface包含了字体的类型,粗细,还有倾斜、颜色等。 void setUnderlineText(boolean underlineText) //设置下划线 最终Canvas和Paint在onDraw中直接使用 @Override

protected void onDraw(Canvas canvas) { Paint paintRed=new Paint(); paintRed.setColor(Color.Red); canvas.drawPoint(11,3,paintRed); //在坐标11,3上画一个红点

} 下一次Android123将会具体讲到强大的Path路径,和字体Typeface相关的使用。 30. View类详解

在Android游戏开发之旅二中我们讲到了View和SurfaceView的区别,今天Android123从View类开始着重的介绍Android图形显示基类的相关方法和注意点。 自定义View的常用方法: onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发 onSizeChanged(int, int, int, int) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onKeyDown(int, KeyEvent) 有按键按下后触发 onKeyUp(int, KeyEvent) 有按键按下后弹起时触发 onTrackballEvent(MotionEvent) 轨迹球事件 onTouchEvent(MotionEvent) 触屏事件 onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发 onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发 onAttachedToWindow() 当view被附着到一个窗口时触发 onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的。 onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发 以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的: @Override

protected void onDraw(Canvas canvas) {

//这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色 Paint paintBackground = new Paint();

paintBackground.setColor(getResources().getColor(R.color.xxx)); //从Res中找到名为xxx的

color颜色定义

canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //设置当前画布的背景颜色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充。 具体的请查看Android123未来讲到的Canvas和Paint,在Canvas中我们可以实现画路径,图形,区域,线。而Paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型等等。 } 当然还有就是处理窗口还原状态问题(一般用于横竖屏切换),除了在Activity中可以调用外,开发游戏时我们尽量在View中使用类似 @Override protected Parcelable onSaveInstanceState() { Parcelable p = super.onSaveInstanceState(); Bundle bundle = new Bundle(); bundle.putInt(\ bundle.putInt(\

bundle.putParcelable(\ return bundle; }

@Override

protected void onRestoreInstanceState(Parcelable state) { Bundle bundle = (Bundle) state;

dosomething(bundle.getInt(\获取刚才存储的x和y信息 super.onRestoreInstanceState(bundle.getParcelable(\

return;

} 在View中如果需要强制调用绘制方法onDraw,可以使用invalidate()方法,它有很多重载版本,同时在线程中的postInvailidate()方法将在Android游戏开发之旅六中的 自定义View完整篇讲到。

31. View和SurfaceView

在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas lockCanvas()

Canvas lockCanvas(Rect dirty) 、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在SurfaceHolder.Callback 接口回调中可以通过下面三个抽象类可以自己定义具体的实现,比如第一个更改格式和显示画面。 abstract void surfaceChanged(SurfaceHolder holder, int format, int width, int height) abstract void surfaceCreated(SurfaceHolder holder) abstract void surfaceDestroyed(SurfaceHolder holder)

对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。 32. Android程序内存管理必读

很多开发者都是从J2ME或J2EE上过来的,对于内存的使用和理解并不是很到位,Android

开发网本次给大家一些架构上的指导,防止出现豆腐渣工程的出现。Android作为以Java语言为主的智能平台对于我们开发一些高性能和质量的软件来说了解Android程序内存管理机制是必须的。 Android的Dalvik VM在基础方面和Sun JVM没有什么大的区别仅仅是字节码的优化,我们要知道什么时候用gc什么时候用recycle以及到底用不用finalization,因为Java对内存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。 1.对于常规开发者而言需要了解 Java的四种引用方式,比如强引用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。 2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,这里Android123提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。 3.Android为每个程序分配的对内存可以通过Runtime类的totalMemory() freeMemory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Dalvik.VMRuntime类的getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences() 方法,获取更多的运行内存。 4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。 5. 不要在循环中创建过多的本地变量。 有关Android和Java的系统性能分析,Android123将在以后的文章中详细讲述如何调试Java分析内存泄露以及Android上的gdb调试器分析得出内存性能改进。 33. Android中内嵌字体实现个性化

在Android中我们的应用可以灵活的内嵌自己的字体文件,实现各个手机上可以正常的显示个性化文字,我们都知道TextView的setTypeface方法可以设置目标文字的显示特性,比如字体、颜色、粗体、斜体等。我们直接找一个TrueTypeFont的字体文件即.ttf,对于Win32系统的用户可以直接在Windows/fonts文件夹中能找到很多。比如微软雅黑就不错,可是体积太大,由于Android的Assets类有单个文件1MB体积的限制,我们先找个英文字体做测试。这里我们将字体文件android123.ttf放到工程的assets文件夹的fonts目录中。 Typeface tf = Typeface.createFromAsset(getAssets(), \

TextView tv = (TextView)findViewById(R.id.text); tv.setTypeface(tf); //设置TextView的风格

tv.setText(\ tv.setTextSize(12);

tv.setTextColor(Color.RED); 34. 获取和设置ListView的选择项

获取当前选中项 int curPos = listView.getFirstVisiblePosition(); 当然是用getItemAtPosition(int nPos)方法也可以 ,设置当前选择位置 listView.setSelectedPosition(lastPos); 对于基于AbsListView为基类的ListView等控件均可以使用这种方法。

35. android.text.format文件大小和日期解析类

很多网友可能直接将自己的J2ME项目生硬的移植到Android平台,其实Google为我们提供好了文件大小和时间日期解析类,它位于android.text.format这个包中,它提供了强大的标准化解析方法: 1. IP地址解析类 在android.text.format.Formatter中提供了String formatIpAddress(int addr) 这个方法可以轻松方便的将socket中的int型转成类似127.0.0.1的IP格式,需要注意的是Linux平台的字节顺序,即小字节序、低字节序little-endian。 2. 文件大小解析类 细心的网友可能还看到了android.text.format.Formatter中的formatFileSize方法,该方法String formatFileSize (Context context, long number) ,第二个参数是long型,一

般为File对象的最后修改时间或创建时间的方法,最终返回类似 12KB、5Bytes的值,20MB的字符串。 3. 日期时间解析类 ,该类位于android.text.format.DateFormat这个package中,该类提供了Java中的三种时间对象,Android123提示大家下面三种方法为静态可以直接调用,如下: final static CharSequence format(CharSequence inFormat, Date inDate) //传入Date对象

Given a format string and a Date object, returns a CharSequence containing the requested date. final static CharSequence format(CharSequence inFormat, Calendar inDate) //Calendar对象 Given a format string and a Calendar object, returns a CharSequence containing the requested date. final static CharSequence format(CharSequence inFormat, long inTimeInMillis) //long对象 Given a format string and a time in milliseconds since Jan 1, 1970 GMT, returns a CharSequence containing the requested date. 我们可能看到了第一个参数均为inFormat这是一个CharSequence接口的String类型,它提供了灵活的时间格式解析字符串描述,Android开发网提示大家注意大小写要区分,如 April 6, 1970 at 3:23am 例子,那么inFormat参数的写法和最终执行的结果如下对照,下面就以Android123的CWJ生日为例子如下 \h:mmaa\

\

\

\

\ 对于判断一个时间是否为24小时制式可以通过android.text.format.DateFormatboolean is24HourFormat(Context context)方法来判断。

类的

static

36. Android代码性能优化技巧

目前来说Android 2.2的JIT性能有了本质的提高,不过对于老版本的程序提高Java执行效率还有很多语言特点来说,今天Android123提到的不是语法糖,而是基础的问题,对于Java 1.5之后将会有明显的改进。下面的例子来自SDK: static class Foo { int mSplat; }

Foo[] mArray = ... 上面的静态类Foo的执行效果和性能,我们分三个方法zero、one和two来做对比。

public void zero() { //大多数人可能简单直接这样写 int sum = 0;

for (int i = 0; i < mArray.length; ++i) { sum += mArray.mSplat; }

}

public void one() { //通过本地对象改进性能 int sum = 0;

Foo[] localArray = mArray; int len = localArray.length; for (int i = 0; i < len; ++i) { sum += localArray.mSplat;

} }

public void two() { //推荐的方法,通过Java 1.5的新语法特性可以大幅改进性能

int sum = 0;

for (Foo a : mArray) { sum += a.mSplat; }

} zero() is slowest, because the JIT can't yet optimize away the cost of getting the array length once for every iteration through the loop. one() is faster. It pulls everything out into local variables, avoiding the lookups. Only the array length offers a performance benefit. two() is fastest for devices without a JIT, and indistinguishable from one() for devices with a JIT. It uses the enhanced for loop syntax introduced in version 1.5 of the Java programming language. 37. Android开发注意点 Part One

Android已经的很多细节问题我们通过平台开发总结不断完善这个列表,如果你有相关的内容可以联系 android123@163.com . 一、AssetManager - 已知单个文件处理不能大于1MB,所以如果资源很大,建议使用Zip格式压缩存放。 二、ScrollView中嵌入ListView - 这个作法可能会出现你的ListView仅仅显示1行半。 三、Android自带的Zip处理类对文件名编码无法识别,也没有提供显示的设置方法,在zlib中写死了。 四、使用一些资源对象记住关闭,比如对于文件流对象最后 FileOutputStream os = xxx; try {

//dosomething } finally {

os.close(); //显示的使用finally关闭文件对象。

} 对于Cursor而言,在移动位置时首先判断Cursor是否为空,最终使用完仍然需要 close方法,如果重用,可以使用deactivate方法释放当前资源,通过requery方法再次查询。 五、SDK中标记为 deprecated 字样的,常规情况下是有更好的方法可以替代,短期内可以放心使用。这些方法一般高版本的SDK都可以向上兼容,目前尚未发现Android放弃某些API的支持。 六、Notification的Intent无法传递到目标的Activity,Service和Broardcast没有测试过,中途需要通过PendingIntent,可能这里出现了问题。 38. Android上HTTP协议通讯状态获取

通常情况下轻量级的Http传输Android平台可以直接使用Sun Java的HttpURLConnection类方法处理,比如果自己定义一次请求header可以通过setRequestProperty设置,而我们需要获取的Http Web Server状态可以通过HttpURLConnection.getResponseCode() 的方法获取。 当然Http协议返回值常见的有 200 为成功,400为请求错误,404为未找到,500为服务器内部错误,403无权查看,302为重定向等等。 对于Android平台提供更完善的Apache类有HttpClient 、HttpPost、HttpResponse、HttpGet和HttpEntity,其中对于数据报头header构造通过HttpEntity,而返回状态值可以通过HttpResponse获取。 有关Android客户端和Server通讯类相关的开发我们将会在以后文章中做大量实例介绍。 39. Android布局Java代码构造法

一般情况下对于Android程序布局我们往往使用XML文件来编写,这样可以提高开发效率,但是考虑到代码的安全性以及执行效率,可以通过Java代码执行创建,虽然Android编译过的xml是二进制的,但是加载xml解析器的效率对于资源占用还是比较大的,一般一个简单的TextView,比如

android:id=\

android:layout_width=\

android:layout_height=\/> 可以等价于下面的Java代码: LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT); //宽度为100px,高为自适应最小的高度 //


android单实例运行方法(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:桥面铺装施工方案(预留后浇带、槽钢做轨道法)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: