android view强制重绘_Android的view重绘

android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。

想写一个复杂一点的游戏,是必须用到SurfaceView来开发的,不要老想着用Layout和view去实现,不要将某个游戏

中的对象做成一个组件来处理。应该尽量想着在Canvas(画布)中画出游戏戏中的背景、人物、动画等.

android 开发文档

引用

public void invalidate()

Invalidate the whole view. If the view is visible, onDraw(Canvas)

will be called at some point in the future. This must be called from a

UI thread. To call from a non-UI thread, call postInvalidate().

public void postInvalidate ()

Cause an invalidate to happen on a subsequent cycle through the

event loop. Use this to invalidate the View from a non-UI thread.

示例:

gameview

Java代码  

publicclassGameViewextendsView

{

intmiCount =0;

inty =0;

publicGameView(Context context)

{

super(context);

}

//

//具体绘图内容我们紧接着就会讲

publicvoidonDraw(Canvas canvas)

{

if(miCount <100)

{

miCount++;

}

else

{

miCount = 0;

}

//绘图

Paint mPaint = newPaint();

switch(miCount%4)

{

case0:

mPaint.setColor(Color.BLUE);

break;

case1:

mPaint.setColor(Color.GREEN);

break;

case2:

mPaint.setColor(Color.RED);

break;

case3:

mPaint.setColor(Color.YELLOW);

break;

default:

mPaint.setColor(Color.WHITE);

break;

}

//绘制矩形--后面我们将详细讲解

canvas.drawRect((320-80)/2, y, (320-80)/2+80, y+40, mPaint);

}

}

第一个重绘方法

Java代码  

publicclassActivity01extendsActivity

{

privatestaticfinalintREFRESH     =0x000001;

/* 声明GameView类对象 */

privateGameView            mGameView   =null;

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

/* 实例化GameView对象 */

this.mGameView =newGameView(this);

// 设置显示为我们自定义的View(GameView)

setContentView(mGameView);

// 开启线程

newThread(newGameThread()).start();

}

Handler myHandler   = newHandler()

{

//接收到消息后处理

publicvoidhandleMessage(Message msg)

{

switch(msg.what)

{

caseActivity01.REFRESH:

mGameView.invalidate();

break;

}

super.handleMessage(msg);

}

};

classGameThreadimplementsRunnable

{

publicvoidrun()

{

while(!Thread.currentThread().isInterrupted())

{

Message message = newMessage();

message.what = Activity01.REFRESH;

//发送消息

Activity01.this.myHandler.sendMessage(message);

try

{

Thread.sleep(100);

}

catch(InterruptedException e)

{

Thread.currentThread().interrupt();

}

}

}

}

//详细事件处理见第三章

//当然这些事件也可以写在GameView中

//触笔事件

publicbooleanonTouchEvent(MotionEvent event)

{

returntrue;

}

//按键按下事件

publicbooleanonKeyDown(intkeyCode, KeyEvent event)

{

returntrue;

}

//按键弹起事件

publicbooleanonKeyUp(intkeyCode, KeyEvent event)

{

switch(keyCode)

{

//上方向键

caseKeyEvent.KEYCODE_DPAD_UP:

mGameView.y-=3;

break;

//下方向键

caseKeyEvent.KEYCODE_DPAD_DOWN:

mGameView.y+=3;

break;

}

returnfalse;

}

publicbooleanonKeyMultiple(intkeyCode,intrepeatCount, KeyEvent event)

{

returntrue;

}

}

第二种方法

Java代码  

classGameThreadimplementsRunnable

{

publicvoidrun()

{

while(!Thread.currentThread().isInterrupted())

{

try

{

Thread.sleep(100);

}

catch(InterruptedException e)

{

Thread.currentThread().interrupt();

}

//使用postInvalidate可以直接在线程中更新界面

mGameView.postInvalidate();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值