android 自定义加减按钮

1.定义两个shape:

my_button_shape_normal.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="1dp"
        android:color="#007FFF" />

    <corners android:radius="5dip" />

    <padding
        android:bottom="1dp"
        android:left="10dp"
        android:right="10dp"
        android:top="1dp" />

</shape>

 my_button_shape_pressed.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="1dp"
        android:color="#007FFF" />

    <corners android:radius="5dip" />

    <padding
        android:bottom="1dp"
        android:left="10dp"
        android:right="10dp"
        android:top="1dp" />

</shape>

 2。定义一个drawable:my_button_style.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/my_button_shape_normal" android:state_focused="false" android:state_pressed="false"></item>
    <item android:drawable="@drawable/my_button_shape_pressed" android:state_focused="false" android:state_pressed="true"></item>

</selector>

 3.定义button布局(mybutton.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/reduce"
        android:layout_width="50dp"
        android:layout_height="30dp"
        android:background="@drawable/my_button_style"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:text="-"
        android:textColor="#007FFF" />

    <Button
        android:id="@+id/add"
        android:layout_width="50dp"
        android:layout_height="30dp"
        android:layout_toRightOf="@+id/reduce"
        android:background="@drawable/my_button_style"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:text="+"
        android:textColor="#007FFF" />

</RelativeLayout>

 4.定义MyButton类:

public class MyButton extends RelativeLayout {
	private View view;
	private Button add, reduce;

	private OnAddReduceChangeStatusListener mAddReduceChangeStatusListener;

	public MyButton(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public MyButton(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		view = LayoutInflater.from(context).inflate(R.layout.mybutton, this, true);

		init();
	}

	public MyButton(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	private void init() {
		add = (Button) view.findViewById(R.id.add);
		reduce = (Button) view.findViewById(R.id.reduce);

		add.setOnTouchListener(new ComponentOnTouch());
		reduce.setOnTouchListener(new ComponentOnTouch());
	}

	class ComponentOnTouch implements OnTouchListener {

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.add:
				if (mAddReduceChangeStatusListener != null) {
					mAddReduceChangeStatusListener.add(MyButton.this.getId(),event.getAction());
				}
				break;
			case R.id.reduce:
				if (mAddReduceChangeStatusListener != null) {
					mAddReduceChangeStatusListener.reduce(MyButton.this.getId(),event.getAction());
				}
				break;
			}
			return true;
		}
	}

	public void setOnAddReduceChangeStatusListener(OnAddReduceChangeStatusListener listener) {
		this.mAddReduceChangeStatusListener = listener;
	}

	public abstract interface OnAddReduceChangeStatusListener {
		public abstract boolean add(int viewId,int eventAction);

		public abstract boolean reduce(int viewId,int eventAction);

	}
}

 5。布局中使用:

<package.MyButton
            android:id="@+id/mybutton_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </package.MyButton>

 6.代码中使用:

     a.初始化:

mybutton = (MyButton) findViewById(R.id.mybutton_id);
		mybutton.setOnAddReduceChangeStatusListener(new OnAddReduceListener());

     b.listener监听:

class OnAddReduceListener implements OnAddReduceChangeStatusListener {

		@Override
		public boolean add(int viewId, int eventAction) {
			// TODO Auto-generated method stub
			if (eventAction == MotionEvent.ACTION_DOWN) {
				onTouchChange("add");
			} else if (eventAction == MotionEvent.ACTION_UP) {
				if (plusThread != null) {
					isOnLongClick = false;
				}
			} else if (eventAction == MotionEvent.ACTION_MOVE) {
				if (plusThread != null) {
					isOnLongClick = true;
				}
			} else if (eventAction == MotionEvent.ACTION_CANCEL) {
				if (plusThread != null) {
					isOnLongClick = false;
				}
			}
			return true;
		}

		@Override
		public boolean reduce(int viewId, int eventAction) {
			// TODO Auto-generated method stub
			if (eventAction == MotionEvent.ACTION_DOWN) {
				onTouchChange("reduce");
			} else if (eventAction == MotionEvent.ACTION_UP) {
				if (miusThread != null) {
					isOnLongClick = false;
				}
			} else if (eventAction == MotionEvent.ACTION_MOVE) {
				if (miusThread != null) {
					isOnLongClick = true;
				}
			} else if (eventAction == MotionEvent.ACTION_CANCEL) {
				if (miusThread != null) {
					isOnLongClick = false;
				}
			}
			return true;
		}
	}

	private void onTouchChange(String method) {
		if (method.equals("add")) {
			plusThread = new PlusThread();
			isOnLongClick = true;
			plusThread.start();
		} else if (method.equals("reduce")) {
			miusThread = new MiusThread();
			isOnLongClick = true;
			miusThread.start();
		}
	}

    c,定义两个线程用来加减:

// 减操作
	class MiusThread extends Thread {
		@Override
		public void run() {
			while (isOnLongClick) {
				try {
					Thread.sleep(200);
					myHandler.sendEmptyMessage(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				super.run();
			}
		}
	}

	// 加操作
	class PlusThread extends Thread {
		@Override
		public void run() {
			while (isOnLongClick) {
				try {
					Thread.sleep(200);
					myHandler.sendEmptyMessage(2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				super.run();
			}
		}
	}

 使用Handler进行处理:

Handler myHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			if (msg.what == 1) {
				//加操作
			} else if (msg.what == 2) {
				//减操作
			}
		}
	};

相关推荐