2011年2月11日 星期五

[Android] Class extends View(繼承View)

android 除了可以在XML裡面設計畫面以外,還可以使用Class 繼承 View來達到更好的效果

首先,先在src底下新增一個class 讓它繼承View,


public class ViewTest extends View
{
Paint p=new Paint();
public ViewTest(Context context) //contructor
{
super(context);
}
@Override
public void onDraw(Canvas c) //繪製
{
p.setColor(Color.WHITE);
c.drawText("Hello! View",20,20,p);
}
}

上面是個簡單的View Code,

(1)第1個method


public ViewTest(Context context) //contructor
{
super(context);
}



這是一個Contructor,而它所帶的參數 "Context",通常指的是Main.class ,
也就是繼承 activity的那個class。

如果想要取得Main.class 底下的變數或是物件,也可以藉由這個參數取得
例如:


Main m;
public ViewTest(Context context) //contructor
{
super(context);
m = (Main)context;
}

(2) 第2個method


public void onDraw(Canvas c)
{
p.setColor(Color.WHITE);
c.drawText("Hello! View",20,20,p);
}


這個method是在View將要顯示在畫面上時,會被呼叫一次,
或者我們需要畫面重繪時,呼叫 invalidate( ) 讓畫面重繪, 而invalidate()也是再呼叫onDraw(Canvas c),讓畫面重繪。

View的簡單用法大致上就這樣,可是還有一個重要的步驟,
寫完View以後,我們還要把view掛在Main.class 上面,


ViewTest vt;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
vt=new ViewTest(this);
setContentView(vt);
}

在Main.class 裡面宣告一個ViewTest 的物件,然後把Main.class當作參數丟給它。
setContentView() 原本預設應該是 R.layout.main ,但是我們有自己寫一個view,
所以把R.layout.main改成 vt丟進去,這樣就大功告成了。

2 則留言:

  1. 請問一下如何在src底下新增一個class呢?
    我的方法是在src按右鍵new 在點class
    但是裡面只有public class MyView
    沒有public class ViewTest extends View
    謝謝解答!

    回覆刪除
  2. 請問取得Main就可以使用在Main裡有的物件嗎?
    還有一個問題用XML 作的按鈕可以在VIEW中使用嗎?

    回覆刪除