Android自定义Button [附一个例子吧]


1. 不用再定义Listener
直接调用 performClick ,里面会调用View.OnClickListener

2. Drawable
资源里的真正图形资源,如png, gif等,在加载时实际上都是BitmapDrawable类型的对象。
mIconAccept = (BitmapDrawable)context.getResources()
    .getDrawable(R.drawable.latebutton_ok);
应该直接转换成BitmapDrawable对象,以便在canvas里可以直接drawBitmap

3. 图形的显示大小: 虽然图形可能是32*32,但在代码应该调用以下2个函数来获取长宽
mIconAccept.getIntrinsicWidth()
mIconAccept.getIntrinsicHeight()

4. 继承于Button应该会更方便

5. 使用已经存在的attribute
使用android:text属性来设置文本, 在代码用getAttributeValue()来获取。注意namespace要用全称。
    <com.friendlocation.LateButton
        android:id="@+id/lateButton1"
        android:layout_width="300dp"
        android:layout_height="36dp"
        android:text="查询" />

 public LateButton(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  
  mText = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "text");
  if(mText == null) mText = "Default Text";
 }

6. 区分编辑状态
 public LateButton(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  if(! this.isInEditMode())
  {
   mIconAccept = (BitmapDrawable)context.getResources()
    .getDrawable(R.drawable.latebutton_icon); 
  }
7. 显示所有属性
   for(int i=0; i<attrs.getAttributeCount(); i++)
   {
    String name = attrs.getAttributeName(i);
    String value = attrs.getAttributeValue(i);
    //Log.d("mylog",  "attr :" + name + "= " + value);
    if(name.equals("text"))
     mText = value;
   }

 

/* 只是一个例子,大家按照自己的需求修改  */

public class LateButton extends Button
{
	boolean   mPressed = false;
	MyHandler mHandler = new MyHandler();
	int       mProgress = 0;
		
	String  mText = "DefaultText";
	
	// 画图
	Paint mBgPaint = new Paint();
	Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
	
	public LateButton(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		if(! this.isInEditMode())
		{
	
		}
		
		mText = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "text");
		if(mText == null) mText = "Default Text";
	}
	
	@Override
	protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		
		int w = getWidth();
		int h = getHeight();
		Rect clientRect = new Rect(0,0,w,h);
		clientRect.inset(4,4);
		
		// 画背景
		mBgPaint.setColor(0xFFb0c4de);
		canvas.drawRoundRect(new RectF(clientRect), 4,4, mBgPaint);
		
		if(mPressed)
		{
			...............
			
		}
		
		mTextPaint.setColor(0xFF444444);
		mTextPaint.setTextSize(28); 
		mTextPaint.setTextAlign(Align.CENTER);		
		canvas.drawText(mText, 
				clientRect.centerX(), clientRect.centerY()+10, mTextPaint);
	
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent e)
	{
		switch(e.getAction())
		{
			case MotionEvent.ACTION_DOWN:
			{
				onTapBegin(e.getX(), e.getY());
				break;
			}
			case MotionEvent.ACTION_UP:
			{
				onTapEnd(e.getX(), e.getY());
				break;
			}
		}
		return true;
		//return this.mDetector.onTouchEvent(event);
	}
	
	// 处理单击事件
	public void onTapBegin(float x, float y)
	{
		mPressed = true;
		
		this.invalidate();		
	}
	
	public void onTapEnd(float x, float y)
	{
		// 停止 timer
		mTimer.mStop();
		mTimer = null;		
		mPressed = false;
			// 响应按钮动作
			// Log.d("mylog", "........ button is pressed ........");
			this.performClick(); // View类函数, 触发OnClickListener
				
		this.invalidate();
	}
	
}

Android自定义Button [附一个例子吧]_第1张图片"极星亲友定位":  简单实用,是一款适用于家人、朋友间的定位软件,实时查询对方的位置并以地图方式展示。非常适合用于家人间使用,少一份担心,多一份安全保证,能及时知道家人的去向,能避免找不到孩子、老人等情形。

(其实时性、自动特性,可以在很大程度上保证家人遇到危险时不掉链子)

不需要对方会使用智能手机,因为软件可以设置白名单自动回复,不需要对方作任何操作就能获取对方的位置。
不需要对方打开软件回复,也不需要事先启动软件。

下载位置:360市场(可以用360手机助手下载, 关键词“极星”,“极星亲友定位”) 

- 双方只要安装了本软件,并打开了GPS功能(一般手机都已经打开了),即输入对方手机号、查询位置。
- 可以从通讯录中选择联系人,或从“最近联系人”菜单中直接选择。
- 白名单用于指定受信任的联系人,对他们的查询请求会自动回复。
- 集成地图展示功能,如果手机已经安装了百度地图软件,则可以在地图上展示对方的位置。
- 可以防止误操作:发送按钮采用延时反应设计,只有在按下约1秒后才算是确认发送,并以振动和文字提示您发送成功。

----------------------------------------------------------------------------------------------------------------------------------


你可能感兴趣的:(Android自定义Button [附一个例子吧])