安卓开发之自定义控件(三)

1.自定义EditText


 例如上面这个有下划线的EditText,就是自定义的

/**
 * 自定义EditText
 * @author tanlvxu
 *
 */
public class MyEditText extends EditText {

	private static final int SEG_CNT = 9;//总的下划线,上图所示9个
	private static final int SEG_GAP_WIDTH = 2;//每个下划线的间距2
   /**
    *必须重写两个构造方法
    */
	public MyEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public MyEditText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

//	public MyEditText(Context context) {
//		super(context);
//	}
	/**
	 * 要改变其外形,重写其onDraw()方法,改变其点击事件,重写其onClick等方法
	 */
	@Override
	public void onDraw(Canvas canvas) {
		
		Paint paint = new Paint();
		paint.setColor(Color.WHITE);
		paint.setStyle(Style.FILL);
		int height = getHeight();//获取父件高度
		int width = getWidth();//获取父件宽度
		int segLength = (width + SEG_GAP_WIDTH)/SEG_CNT - SEG_GAP_WIDTH;//求得每一根下滑线的长度		
		for(int i = 0; i < SEG_CNT; i++)
		{
			canvas.drawRect(i * (segLength + SEG_GAP_WIDTH), height -1 , i * (segLength + SEG_GAP_WIDTH) + segLength, height, paint);
		}
	}
}

 在xml对应的布局中

  <com.example.guseewho.MyEditText
      android:background="#00000000"
      android:ems="10"
      android:textColor="#FFFFFFFF"
      >
  </com.example.guseewho.MyEditText>

   要把它的背景设置成透明,#00000000

   前两个0是透明度00到ff,从透明到不透明

   后面6个0对应的是RGB值.具体可以参照比色表.

      http://www.wahart.com.hk/rgb.htm

2.自定义SurfaceView

 

 做这个游戏的时候,查了很多资料,把surfaceView放在xml上比直接显示要好些.

并且能够加任意控件.

/**
 * 自定义SurfaceView
 * @author tanlvxu
 *
 */
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,
Runnable {
	private SurfaceHolder surfaceHolder ;//控制器
    /**
     * 要放入布局中,必须实现其两个参数的构造方法
     * @param context
     * @param attrs
     */
	public MySurfaceView(Context context, AttributeSet attrs) {
		super(context, attrs);
		surfaceHolder = getHolder();
		surfaceHolder.addCallback(this);
		/**
		 *  Canvas canvas	= surfaceHolder.lockCanvas() ; //锁定屏幕,获取画布
		 *  surfaceHolder.unlockCanvasAndPost(canvas) ;//传递画布,开始绘画
		 */
	}
    
	@Override
	public void run() {
		/**
		 * 刷新画布
		 */
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		
	}
   /**
    * 创建时调用该方法
    */
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		/**
		 * 线程在这启动
		 * 通过getHeight() ; getWidth();获取其控件的大小
		 */
		
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		/**
		 * 可以在这里关闭线程
		 */
	}

}

  再Activity中的setContentView();方法之后再取得该组件,不然会报空指针异常

在xml中:

<com.example.view.GameView 
        android:id="@+id/MySurfaceView"
        android:layout_width="自己定义"
        android:layout_height="自己定义"
>
</com.example.view.GameView>

要更好的控制游戏的存储与读取,可以加个Dialog



 

要在上面加广告,可以在暂停游戏的时候做点功夫



 

猜你喜欢

转载自1350579085.iteye.com/blog/2010040