当前位置: 编程技术>移动开发
本页文章导读:
▪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()方法的.所以没有必要把线程给终止.
我只是想让整个程序看起来有始有终,或许看起来多余。呵呵
最新技术文章: