2012-10-14 23 views
0

我正在尋找一種簡單的方法來在Android中爲自定義視圖設置動畫效果。我試圖避免使用animator對象,但想要使用原始線程。我所做的是創建一個自定義視圖,創建一個類延伸 android.view.View。然後我重寫onDraw方法並使用畫布繪製矩形。我想要的是縮小矩形,所以我保留一個變量來表示矩形右側的x值。然後我會喜歡隨着時間的推移,矩形的右邊縮小。我想要做的就是創建一個新線程,啓動它並讓它改變矩形的值。除視圖之外的所有作品在您致電View.invalidate之前不會更新。問題是我不能從我產生的線程調用它,因爲它不是UI線程。我閱讀使用處理程序的解決方案...但我仍然不確定這是否是正確的解決方案,然後如何使用它們。Android自定義視圖和處理程序

package com.example.practicum; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.os.Handler; 
import android.os.Message; 
import android.util.AttributeSet; 
import android.view.View; 

public class TimerControl extends View implements Runnable, Handler.Callback 
{ 
    private Paint paint; 
    private Rect rect; 
    private Thread t; 
    private Handler h; 

    public TimerControl(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 



     paint = new Paint(); 
     paint.setColor(Color.BLUE); 
     rect = new Rect(0,0,60,60); 
     t = new Thread(this); 
     t.start(); 


     h = new Handler(this); 
     //h.post(this); 
    } 

    @Override 
    public void onDraw(Canvas canvas) 
    { 
     canvas.drawRect(rect, paint); 
    } 

    @Override 
    public void run() 
    { 
     rect.right = rect.right-1; 
     while(true) 
     { 
      rect.right = rect.right-1; 
      this.invalidate(); 
      try 
      { 
       Thread.sleep(5000); 
       h.sendEmptyMessage(0); 
      } 
      catch (InterruptedException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public boolean handleMessage(Message msg) 
    { 

     return false; 
    } 

} 

回答

2

可以定義(在UI線程),一個全球性的處理程序:

Handler mHandler = new Handler(); 

然後,從你的線程,請致電:

mHandler.post(new Runnable() { 
    public void run() {    
     // call some method on the UI thread 
    } 
}); 
+0

這就是我一直在尋找!謝謝! – Matthew