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 stubview = 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 {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubswitch (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 {@Overridepublic boolean add(int viewId, int eventAction) {// TODO Auto-generated method stubif (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;}@Overridepublic boolean reduce(int viewId, int eventAction) {// TODO Auto-generated method stubif (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 {@Overridepublic void run() {while (isOnLongClick) {try {Thread.sleep(200);myHandler.sendEmptyMessage(1);} catch (InterruptedException e) {e.printStackTrace();}super.run();}}}// 加操作class PlusThread extends Thread {@Overridepublic void run() {while (isOnLongClick) {try {Thread.sleep(200);myHandler.sendEmptyMessage(2);} catch (InterruptedException e) {e.printStackTrace();}super.run();}}}

使用Handler进行处理:

Handler myHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif (msg.what == 1) {//加操作} else if (msg.what == 2) {//减操作}}};

更多相关文章

  1. android AlertDialog 弹窗自定义布局 点击外部不关闭弹窗
  2. 自定义progressbar使用图片
  3. android 相对布局覆盖问题

随机推荐

  1. golang语言学习之什么是golang
  2. docker修改默认指定路径
  3. LEADTOOLS HTML5 JavaScript控件入门介绍
  4. 我的第十个代码
  5. 几种Linux系统切换内核启动顺序方法
  6. PHP基础: 字符串函数
  7. 我的第13个代码
  8. 三十而已的年纪,三十真的可以还可以转行吗
  9. 我的第12个代码
  10. 航电oj2006-2008参考代码