android的自定義控件簡單(一)

轉自:http://www.2cto.com/kf/201408/324688.html

一個自定義的控件通常可能重寫以下的方法:

     1.一個構造方法, 獲取Context。

2.onFinishlnflate()這是一個回調方法, 當應用從 XML 佈局文件加載該組件並利用

它來構建界面之後, 該方法就會被回調

3.onMeasure(int,int):調用該方法來檢測View組件及它所包含的所有子組件的大小.

4.onlayout(boolean,int,int,int,int):當該組件需要分配其子組件的位置、大小時,

該方法就會被回調. View類中佈局發生改變時會調用的方法,這個方法是所有View、ViewGroup及其派生類都具有的方法,重載該類可以在佈局發生改變時作定製處理,這在實現一些特效時非常有用。

5.onSizeChanged(int,int, int, int):當該組件的大小被改變時回調該方法.

6.onDraw(canves): 當該組件將要繪製它的內容時回調該方法迸行繪製. View類中用於重繪的方法,這個方法是所有View、ViewGroup及其派生類都具有的方法,也是Android UI繪製最重要的方法。開發者可重載該方法,並在重載的方法內部基於參數canvas繪製自己的各種圖形、圖像效果。


7.onKeyDown(int,KeyEvent): 當某個鍵被按下時觸發該方法.

8.onKayUp(int,KeyEvent), 當鬆開某個鍵時觸發該方法.


9.onTrackballEvent (MotionEvent): 當發生軌跡球事件時觸發該方法.


10.onTouchEvent (MotionEvent): 當發生觸摸屏事件時觸發該方法.


11.onWindowFocuschanged(boolean): 當該組件得到、失去焦點時觸發該方法.

12.onAttachedToWindow():當把該組件放入某個窗口時觸發該方法.

13.onDetachedFromWindow(): 當把該組件從某個窗口上分離時觸發該方法.

14.onWindowVisibilityChanged(int):當包含該組件的窗口的可見性發生改變時觸發該

方法.


簡單的例子:
創建一個類繼承View
package com.zw.zidingyikongjian;
/**
 * 繼承View重寫onDraw()方法
 * zhangwei
 */

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class ZiDingYiView extends View {

	private float circleX=40;//顯示位置的X座標
	private float circleY=60;
	private float circleR=30;//半徑
	
	public ZiDingYiView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
   
//  重寫ondraw方法
	@Override
   protected void onDraw(Canvas canvas) {
	super.onDraw(canvas);
	//創建並實例化Paint的對象
	Paint p=new Paint();
	p.setColor(Color.RED);
	//繪製小圓點
	canvas.drawCircle(circleX, circleY, circleR, p);
	
   }
	
	
 public float getCircleX() {
		return circleX;
	}

	public void setCircleX(float circleX) {
		this.circleX = circleX;
	}

	public float getCircleY() {
		return circleY;
	}

	public void setCircleY(float circleY) {
		this.circleY = circleY;
	}

	public float getCircleR() {
		return circleR;
	}

	public void setCircleR(float circleR) {
		this.circleR = circleR;
	}
   
}



《二》在activity_main.xml文件中加入佈局,如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >


    <com.zw.zidingyikongjian.ZiDingYiView
        android:id="@+id/drawView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />


</RelativeLayout>

《三》在MaiActivity.java中書寫邏輯
public class MainActivity extends Activity {


private ZiDingYiView drawView=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawView=(ZiDingYiView) findViewById(R.id.drawView);
//
drawView.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
drawView.setCircleX(event.getX());
drawView.setCircleY(event.getY());

drawView.invalidate();
return true;
  }
  });
 }
}




發佈了31 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章