`
bogongjie
  • 浏览: 235937 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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) {
				//减操作
			}
		}
	};

 

分享到:
评论

相关推荐

    android自定义加减按钮

    本文实例为大家分享了android自定义加减按钮的具体代码,供大家参考,具体内容如下 1、定义两个shape: my_button_shape_normal.xml: &lt;?xml version=1.0 encoding=utf-8?&gt; &lt;shape xmlns:android=...

    Android 自定义控件 EditText输入框两边加减按钮Button Demo

    通过这种方式,我们成功地创建了一个自定义的EditText加减按钮组件,可以根据需求在Android应用中灵活使用。这个组件不仅可以控制数值的增减,还可以进行扩展,例如添加数值验证、设置最大最小值限制等功能,以满足...

    android 带加减按钮 EditText控件

    本文将深入探讨如何在Android中创建一个带有加减按钮的EditText控件,该控件常用于输入数量或者评分等场景。我们将分析需求、设计思路,并通过具体的代码实现来详细讲解。 需求分析: 1. 在EditText控件的左右两侧...

    Android 自定义加减选择器(适用于商城购物)

    "Android 自定义加减选择器(适用于商城购物)"就是一个典型的例子,它用于电子商城中商品数量的增减操作,用户可以通过点击加减按钮或者直接输入数字来调整购物车中的商品数量。这个自定义控件不仅提升了交互的便捷...

    Android自定义控件之购物车数量加减器

    可以使用`drawRect()`、`drawText()`等方法绘制加减按钮和数字。同时,可以使用`setPadding()`和`setMargin()`方法来设置内边距和外边距,使控件看起来更美观。 4. **事件监听**: 需要为加号和减号按钮设置点击...

    Android 自定义控件 EditText输入框两边加减按钮Button

    本教程将深入探讨如何创建一个自定义的EditText控件,该控件在其两侧添加了加减按钮(Button),以实现数字的增减操作。这样的设计常见于商品数量选择、评分系统等场景。 首先,我们需要创建一个新的View类,继承自...

    Android自定义控件 AddAndSubView【第二版】EditText输入框两边加减按钮Button Demo

    此外,我们还需要为加减按钮设置点击监听器,以便在用户点击时更新EditText的值。 ```java public class AddAndSubView extends ViewGroup { private EditText editText; private Button plusButton, minusButton...

    Android自定义商品购买数量加减控件

    B_通过加减按钮操作数字 C_监听加减按钮 D_数组有最小值和最大值的限制 E_自定义属性  2.提供接口,让外界监听到数字的变化 1_设置接口 @Override public void onClick(View v) { if (v.getId() == R.id.btn_sub)...

    android自定义数字键盘

    这个键盘可以根据实际需求进行扩展,例如添加更多特殊功能按钮,如加减乘除符号,或者增加对多行文本的支持。同时,也可以考虑优化键盘的视觉样式,使其与应用程序的整体设计风格保持一致。通过自定义键盘,开发者...

    android自定义的的Android计算器源码_AS

    这个“android自定义的Android计算器源码_AS”项目为我们提供了一个学习和参考的实例。下面我们将深入探讨这个项目的知识点。 1. **Android Studio集成开发环境**: Android Studio是Google官方推荐的Android应用...

    Android 购物车加减功能的实现代码

    Android 购物车加减功能的实现代码 Android 购物车加减功能是指在 Android 应用程序中实现购物车中商品数量的加减操作。这种功能对于电子商务应用程序非常重要,因为它可以让用户方便地购买商品。この文章将详细...

    安卓自定义控件相关-高仿美团外卖加减号自定义控件.zip

    在Android开发中,自定义控件是提升应用界面独特性...对于想要深入学习Android自定义控件的开发者来说,这是一个很好的实践案例。通过阅读和分析源码,可以提升对Android视图机制的理解,为自己的项目增添更多可能性。

    Android-NumberPickerView仿商城添加商品数量数量加减选择器支持手动输入

    `NumberPickerView`是这样一个自定义控件,它模仿了商城购物界面中常见的一种数量选择器,允许用户通过点击加减按钮或者直接输入数字来改变商品的数量。本文将详细讲解`NumberPickerView`的实现原理、特点以及如何在...

    安卓EditText输入框相关-自定义EditText带加减的.rar

    本压缩包“安卓EditText输入框相关-自定义EditText带加减的.rar”提供的示例可能是为了实现一个带有加减按钮的EditText,允许用户在输入数字时进行增加或减少操作,这种功能常用于购物车数量调整等场景。 要实现...

    android自定义软件盘(数字显示顺序随机)

    1. **设计布局**:使用XML布局文件设计软键盘的界面,包括数字按钮、操作符按钮(如加减乘除)以及清除键等。每个按钮需要设置相应的点击事件监听器。 2. **生成随机顺序**:使用`java.util.Random`类生成0-9的...

    android自定义计算器

    例如,数字0-9通常分布在屏幕下方,运算符如加、减、乘、除以及等号(=)位于上方,而清除(C)和小数点(.)按钮通常置于中央。 接下来,我们需要处理按钮点击事件。在Android中,这可以通过为每个`Button`添加`...

Global site tag (gtag.js) - Google Analytics