当前位置: 编程技术>移动开发
本页文章导读:
▪ViewStub的应用 ViewStub的使用
为了使用ViewStub,你所有需要做的是指定android:id特性,便于以后inflate,指定android:layout特性,引用布局文件。ViewStub还允许你使用第三个特性,android:inflatedId,你可以使用它.........
▪ 标记一个bug. 标记一个bug...
今天一个朋友有个bug没能解决,让我帮他看一下,具体信息是:
2011-05-30 13:43:28.494 localShowImg[2305:207] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIApplication 0.........
▪ 范例3-使用surfaceView 实例3--使用surfaceView
在那本书用的是GameCanvas,我就用surfaceView实现了和实例2相同的效果
效果图:
下面给出MainView 的代码
package com.wjh.demon_3;
import android.content.Context;
import android.graphics.Canvas.........
[1]ViewStub的应用
来源: 互联网 发布时间: 2014-02-18
ViewStub的使用
为了使用ViewStub,你所有需要做的是指定android:id特性,便于以后inflate,指定android:layout特性,引用布局文件。ViewStub还允许你使用第三个特性,android:inflatedId,你可以使用它来重写包含的布局文件中的根元素的id。最后,在ViewStub上设定的layout_*参数将会应用到包含的布局文件的顶部。这里有个例子:
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
当你准备inflate ViewStub时,调用inflate()方法即可。你还可以设定ViewStub的Visibility为VISIBLE或INVISIBLE,也会触发inflate。注意的是,使用inflate()方法能返回布局文件的根View:
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
有一点需要记住的是:当ViewStub inflate后,这个ViewStub就从View层次中移除了。因此,没有必要保留一个对ViewStub的引用(如在类的字段里)。
ViewStub是快捷编程与高效编程之间的产物。与其手动的inflate View并在运行时添加到View层次上,不如简单的使用ViewStub。它相当“廉价”且易于使用。ViewStub唯一的缺点是现在不支持<merge />标签。
为了使用ViewStub,你所有需要做的是指定android:id特性,便于以后inflate,指定android:layout特性,引用布局文件。ViewStub还允许你使用第三个特性,android:inflatedId,你可以使用它来重写包含的布局文件中的根元素的id。最后,在ViewStub上设定的layout_*参数将会应用到包含的布局文件的顶部。这里有个例子:
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
当你准备inflate ViewStub时,调用inflate()方法即可。你还可以设定ViewStub的Visibility为VISIBLE或INVISIBLE,也会触发inflate。注意的是,使用inflate()方法能返回布局文件的根View:
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
有一点需要记住的是:当ViewStub inflate后,这个ViewStub就从View层次中移除了。因此,没有必要保留一个对ViewStub的引用(如在类的字段里)。
ViewStub是快捷编程与高效编程之间的产物。与其手动的inflate View并在运行时添加到View层次上,不如简单的使用ViewStub。它相当“廉价”且易于使用。ViewStub唯一的缺点是现在不支持<merge />标签。
[2] 标记一个bug.
来源: 互联网 发布时间: 2014-02-18
标记一个bug...
今天一个朋友有个bug没能解决,让我帮他看一下,具体信息是:
2011-05-30 13:43:28.494 localShowImg[2305:207] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIApplication 0x4d031a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.' *** Call stack at first throw: ( 0 CoreFoundation 0x00da7be9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x00efc5c2 objc_exception_throw + 47 2 CoreFoundation 0x00da7b21 -[NSException raise] + 17 3 Foundation 0x007796cf _NSSetUsingKeyValueSetter + 135 4 Foundation 0x0077963d -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285 5 UIKit 0x002098d6 -[UIRuntimeOutletConnection connect] + 112 6 CoreFoundation 0x00d1e2cf -[NSArray makeObjectsPerformSelector:] + 239 7 UIKit 0x002082ed -[UINib instantiateWithOwner:options:] + 1041 8 UIKit 0x0020a081 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168 9 UIKit 0x00014943 -[UIApplication _loadMainNibFile] + 172 10 UIKit 0x000154ca -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 291 11 UIKit 0x0001fdb2 -[UIApplication handleEvent:withNewEvent:] + 1533 12 UIKit 0x00018202 -[UIApplication sendEvent:] + 71 13 UIKit 0x0001d732 _UIApplicationHandleEvent + 7576 14 GraphicsServices 0x0101ca36 PurpleEventCallback + 1550 15 CoreFoundation 0x00d89064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 16 CoreFoundation 0x00ce96f7 __CFRunLoopDoSource1 + 215 17 CoreFoundation 0x00ce6983 __CFRunLoopRun + 979 18 CoreFoundation 0x00ce6240 CFRunLoopRunSpecific + 208 19 CoreFoundation 0x00ce6161 CFRunLoopRunInMode + 97 20 UIKit 0x00014fa8 -[UIApplication _run] + 636 21 UIKit 0x0002142e UIApplicationMain + 1160 22 localShowImg 0x000021e9 main + 121 23 localShowImg 0x00002165 start + 53 ) terminate called after throwing an instance of 'NSException' Program received signal: “SIGABRT”.
我估计是xib里面有问题,就问他是否某个IBOutlet没连线,他回答说没有,因为是QQ联系,不能现场看具体情况,我让他打包发邮箱,我打开来看,确实是这个错误,确实xib没啥问题,即使把其他地方注释掉,只留下面这句也还是报错...
[self.window makeKeyAndVisible];
我就怀疑是不是配置有问题,果然...在info.plist文件里面Main nib file base name居然填的不是MainWindow,汗,居然有这种失误.
当我准备给他QQ上说的时候,发现他离线了,留了句:"我重装工具了...果断点",汗,蝈蝈无语了...
后来他重装没装起,也算万幸,毕竟新手,路还很长,谨以此文,共勉之
[3] 范例3-使用surfaceView
来源: 互联网 发布时间: 2014-02-18
实例3--使用surfaceView
我只是想让整个程序看起来有始有终,或许看起来多余。呵呵
在那本书用的是GameCanvas,我就用surfaceView实现了和实例2相同的效果
效果图:
下面给出MainView 的代码
package com.wjh.demon_3; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; public class MainView extends SurfaceView implements Callback,Runnable{ int keyCode = 0; String keyAction = ""; Thread gameThread = null; boolean isGame = true; SurfaceHolder holder = null; public MainView(Context context) { super(context); // TODO Auto-generated constructor stub setFocusable(true); getHolder().addCallback(this); holder = this.getHolder(); } @Override public void run() { // TODO Auto-generated method stub while(isGame) { input(); logic(); doDraw(); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //开始游戏主线程 public void start() { if(gameThread == null) { gameThread = new Thread(this); gameThread.start(); } } //停止游戏主线程 public void stop() { isGame = false; if(gameThread != null) { try { gameThread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //输入判断 public void input() { } //逻辑判断 public void logic() { } public void doDraw() { Canvas c = null; try { c = holder.lockCanvas(); synchronized (holder) { paint(c); } }finally{ if(c != null) { holder.unlockCanvasAndPost(c); } } } //画图 public void paint(Canvas canvas) { Paint backGround = new Paint(); backGround.setColor(Color.BLACK); //清屏 canvas.drawRect(0, 0, getWidth(), getHeight(), backGround); //设置画笔颜色 Paint cPaint = new Paint(); cPaint.setColor(Color.BLUE); cPaint.setTextSize(20); //输出按键的设备码 canvas.drawText("KeyCode:", 10, 20,cPaint); canvas.drawText(""+keyCode,120,20,cPaint); //输出按键的设备名 canvas.drawText("KeyAction:", 10, 80, cPaint); canvas.drawText(keyAction, 120, 80, cPaint); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub stop(); } public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub this.keyCode = keyCode; switch(keyCode) { case KeyEvent.KEYCODE_DPAD_UP: this.keyAction = "UP"; break; case KeyEvent.KEYCODE_DPAD_DOWN: this.keyAction = "DOWN"; break; case KeyEvent.KEYCODE_DPAD_LEFT: this.keyAction = "LEFT"; break; case KeyEvent.KEYCODE_DPAD_RIGHT: this.keyAction = "RIGHT"; break; case KeyEvent.KEYCODE_DPAD_CENTER: this.keyAction = "CENTER"; break; default: this.keyAction="/blog_article/NONE/index.html"; break; } return super.onKeyDown(keyCode, event); } }
apk包(将后缀改为apk):Demon_3.zip
源文件包:Demon_3.rar
1 楼
zhang247124629
2011-05-31
surfaceDestroyed方法中没有必要调用stop().因为来电时.系统会调用surfaceDestroyed(),当结束通话后.系统会重新调用surfaceCreate()方法的.所以没有必要把线程给终止.
2 楼
一口三个汉堡
2011-05-31
zhang247124629 写道
surfaceDestroyed方法中没有必要调用stop().因为来电时.系统会调用surfaceDestroyed(),当结束通话后.系统会重新调用surfaceCreate()方法的.所以没有必要把线程给终止.
我只是想让整个程序看起来有始有终,或许看起来多余。呵呵
最新技术文章: