自定义控件重绘没有效果

============问题描述============


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============



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控制。具體你可以在思考一下
posted @ 2014-10-18 22:30  0基础学android开发  阅读(400)  评论(0编辑  收藏  举报
我要啦免费统计