自定义控件重绘没有效果
============问题描述============
public class MyViewActivity extends ActionBarActivity{ private static final int REFRESH = 0x000001; //声明GameView类对象 private GameView mGameView = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //实例化GameView对象 mGameView = new GameView(this); //设置我们自定义的View setContentView(mGameView); //开启线程 new Thread(new GameThread()).start(); } /** * 触笔事件 */ public boolean onTouchEvent(MotionEvent event){ return true; } /** * 按键按下事件 */ public boolean onKeyDown(int keyCode,KeyEvent event){ if(keyCode == 4){ finish(); } return true; } /** * 按键弹起事件 */ public boolean onKeyUp(int keyCode,KeyEvent event){ switch(keyCode){ case KeyEvent.KEYCODE_DPAD_UP: mGameView.y-= 3; break; case KeyEvent.KEYCODE_DPAD_DOWN: mGameView.y+= 3; break; } return false; } /** * 多点时间 */ public boolean onKeyMultiple(int keyCode,int repeatCount,KeyEvent event){ return true; } Handler myHandler = new Handler(){ public void handleMessage(Message msg) { switch(msg.what){ case REFRESH: mGameView.invalidate(); break; } super.handleMessage(msg); } }; /** * 更新线程 * @author yinhui * */ class GameThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while(Thread.currentThread().isInterrupted()){ Message message = new Message(); message.what = MyViewActivity.REFRESH; //发送消息 MyViewActivity.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block Thread.currentThread().interrupt(); } } } } }
每隔0.1秒自定义的矩形View变换一次颜色,可是现在没有效果,怎么回事?
============解决方案1============
![](http://images0.cnblogs.com/blog/554074/201410/182230138109193.gif)
while(Thread.currentThread().isInterrupted())
=>
while(true)
============解决方案2============
你的理解有偏差,你爲什麼會認爲GameView控件會自動變化,
(1)通過使用invalidate()方法只會重新刷新加載,不會你認爲的“接着執行”,你可以在方法中加上Log日誌打印
//绘画方法 public void onDraw(Canvas canvas){ Log.d("TAG", "執行次數爲:"+miCount); if(miCount < 5){ miCount++; }else{ Toast.makeText(getContext(), "绘画完成", Toast.LENGTH_LONG).show(); } //绘图 Paint mPaint = new Paint(); switch(miCount%4){ case 0: mPaint.setColor(Color.BLUE); break; case 1: mPaint.setColor(Color.GREEN); break; case 2: mPaint.setColor(Color.RED); break; case 3: mPaint.setColor(Color.YELLOW); break; default: mPaint.setColor(Color.WHITE); break; } //绘制矩形 canvas.drawRect((320-80)/2,y,(320-80)/2+80,y+40,mPaint); }你會發現只是輸出了一次。而且miCount得值永遠爲0,
(2)你沒有控制好miCount的值,每次重新初始化後都是0,根據你的代碼只會執行一次,請使用Tiemr來控制,並且讓miCount放在MyViewActivity控制。具體你可以在思考一下