当前位置: 代码迷 >> Android >> 自定义控件重绘没有效果解决方案
  详细解决方案

自定义控件重绘没有效果解决方案

热度:24   发布时间:2016-04-28 04:00:59.0
自定义控件重绘没有效果
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变换一次颜色,可是现在没有效果,怎么回事?
------解决思路----------------------

while(Thread.currentThread().isInterrupted())
=>
while(true)
------解决思路----------------------
你的理解有偏差,你爲什麼會認爲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控制。具體你可以在思考一下
  相关解决方案