重写按钮---attr属性的使用

 首先呢 我们重写两个按钮事件 一个图片button 一个用文字button
package com.pocketjourney.view;



import com.pocketjourney.tutorials.R;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;

import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;

import android.widget.Button;


public class TextOnlyButton extends Button {

	private int notFocusedTextColor, focusedTextColor, pressedTextColor;
	
	private boolean isTextPressed;
	
	public TextOnlyButton(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(attrs);
	}
	public TextOnlyButton(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(attrs);
	}

	public TextOnlyButton(Context context) {
		super(context);
		
		throw new RuntimeException("Valid colors (e.g. #ffffff) must be passed to this class via the XML parameters: pj:textColorNotFocused & pj:textColorFocused.");
	}
	
	private void init(AttributeSet attrs) {
		TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.TextOnlyButton);
		String textColorNotFocused = a.getString(R.styleable.TextOnlyButton_textColorNotFocused);
		String textColorFocused = a.getString(R.styleable.TextOnlyButton_textColorFocused);
		String textColorPressed = a.getString(R.styleable.TextOnlyButton_textColorPressed);
		
        if (textColorNotFocused != null && textColorFocused != null && textColorPressed != null ) {
        	notFocusedTextColor = a.getColor(R.styleable.TextOnlyButton_textColorNotFocused, 0xFF000000);
        	focusedTextColor = a.getColor(R.styleable.TextOnlyButton_textColorFocused, 0xFF000000);
        	pressedTextColor = a.getColor(R.styleable.TextOnlyButton_textColorPressed, 0xFF000000);
        } else {
    		throw new RuntimeException("Valid colors (e.g. #ffffff) must be passed to this class via the XML parameters: pj:textColorNotFocused, pj:textColorFocused, & pj:textColorPressed.");
        }
	}
	
	public void onDrawBackground(Canvas	canvas) {
		//  Override this method & do nothing.  This prevents the parent.onDrawBackground(canvas)  
		//  from drawing the button's background.
	}

	/**
	 *  Capture mouse press events to update text state. 
	 */
	@Override
	public boolean onTouchEvent(MotionEvent	event)
	{
		Log.d("TextOnlyButton",event.getAction()+"");
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			isTextPressed = true;
			
			//  Request a redraw to update the text color
			invalidate();
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			isTextPressed = false;
			
			//  Requesting focus doesn't work for some reason.  If you find a solution to setting 
			//  the focus, please let me know so I can update the tutorial
			requestFocus();
			
			//  Request a redraw to update the text color
			invalidate();
		}
		return super.onTouchEvent(event);
	}

	
	@Override
	public void onDraw(Canvas canvas) {
		
		if (isTextPressed) {
			setTextColor(pressedTextColor);
		}else if (isFocused()) {
			//  Since this Button now has no background.  We adjust the text color to indicate focus.
			setTextColor(focusedTextColor);   
		} else {
			setTextColor(notFocusedTextColor);  
		}
		super.onDraw(canvas);
	}
}

 

package com.pocketjourney.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageButton;

import com.pocketjourney.tutorials.R;

public class ImageOnlyButton extends ImageButton {

	int imageResourceNotFocused, imageResourceFocused, imageResourcePressed;

	private boolean isButtonPressed;
	
	public ImageOnlyButton(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(attrs);
	}

	public ImageOnlyButton(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(attrs);
	}

	public ImageOnlyButton(Context context) {
		super(context);
		throw new RuntimeException("Valid image resource IDs must be passed to this class via the XML parameters: pj:resourceNotFocused & pj:resourceFocused.");
	}

	private void init(AttributeSet attrs) 
	{
		TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.ImageOnlyButton);
        String notFocusedColorStr = a.getString(R.styleable.ImageOnlyButton_resourceNotFocused);
        String focusedColorStr = a.getString(R.styleable.ImageOnlyButton_resourceFocused);
        String pressedColorStr = a.getString(R.styleable.ImageOnlyButton_resourcePressed);
        
        if (notFocusedColorStr != null && focusedColorStr != null && pressedColorStr != null) {
        	imageResourceFocused    = a.getResourceId(R.styleable.ImageOnlyButton_resourceFocused, -1);
        	imageResourceNotFocused = a.getResourceId(R.styleable.ImageOnlyButton_resourceNotFocused, -1);
        	imageResourcePressed    = a.getResourceId(R.styleable.ImageOnlyButton_resourcePressed, -1);
        }
        
        if (imageResourceFocused == -1 || imageResourceNotFocused == -1 || imageResourcePressed == -1) {
    		throw new RuntimeException("Valid image resource IDs must be passed to this class via the XML parameters: pj:resourceNotFocused, pj:resourceFocused, & pj:resourcePressed.");
        }
	}
	
	/**
	 *  Capture mouse press events to update text state. 
	 */
	@Override
	public boolean onTouchEvent(MotionEvent	event)
	{
		Log.d("TextOnlyButton",event.getAction()+"");
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			//  Request a redraw to update the button color
			isButtonPressed = true;
			invalidate();
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			isButtonPressed = false;

			//  Requesting focus doesn't work for some reason.  If you find a solution to setting 
			//  the focus, please let me know so I can update the tutorial
		//	requestFocus();
			
			//  Request a redraw to update the button color
			invalidate();
		}
		return super.onTouchEvent(event);
	}

	@Override
	public void onDraw(Canvas canvas) {
		
		if (isButtonPressed) {
			setImageResource(imageResourcePressed);
		}else if (isFocused()) {
			//  Since this Button now has no background.  We must swap out the image to display 
			//	one that indicates it has focus.
			setImageResource(imageResourceFocused); 
		} else {
			setImageResource(imageResourceNotFocused);
		}
		super.onDraw(canvas);
	}
}

 这里最主要的是init(AttributeSet attrs) 方法,这里呢引用了资源

也就是自定义的属性,这个属性就是和我们平常一样的android:text一样。首先我们要在这个属性中定义我们添加的资源是什么 这里是整形 也就是id,然后通过上述方法引用 以便我们可以在ondraw里面画出我们的资源。当然text和图片button两个init方法不同 有一个多了一个if的判断 一个没有,多了的一个说明 这个属性是必须设定的 如果不设定就会出错。如果缺少if语句判定那么默认这个属性是可以没有的。

 

 <com.pocketjourney.view.TextOnlyButton
    		android:id="@+id/text_only_button"
	        android:layout_width="wrap_content" 
	        android:layout_height="wrap_content"
            android:layout_marginTop="25px"
            style="?android:attr/buttonStyleSmall"
            android:text="Text Button"
            android:background="@drawable/empty"
            pj:textColorNotFocused="@drawable/white"
            pj:textColorFocused="@drawable/android_orange"
            pj:textColorPressed="@drawable/android_yellow"/>  

    <com.pocketjourney.view.ImageOnlyButton 
    		android:id="@+id/image_only_button"
    		android:src="@drawable/help"
	        android:layout_width="wrap_content" 
	        android:layout_height="wrap_content"
            android:layout_marginTop="15px"
            android:background="@drawable/empty"
            pj:resourceNotFocused="@drawable/help"
            pj:resourceFocused="@drawable/help_focused"
            pj:resourcePressed="@drawable/help_pressed"/>
            

 

然后呢就可以在主xml中引用我们自写的属性了,这里要注意亮点

第一个  android:background="@drawable/empty"
这个属性我们设置了一个啥都没有的图片以便我们自定义背景

   pj是自定一的命名空间是必不可缺少的。

源文件可以从福建里面下载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值