Android編程實(shí)現(xiàn)長按Button按鈕連續(xù)響應(yīng)功能示例
本文實(shí)例講述了Android編程實(shí)現(xiàn)長按Button按鈕連續(xù)響應(yīng)功能。分享給大家供大家參考,具體如下:
在電商類app的購物車頁面,經(jīng)常會有這樣的需求:長按“+”按鈕或者“-”按鈕時(shí),購物車中的商品數(shù)量連續(xù)的增加或減少。
本例的目的就是為了實(shí)現(xiàn)這個(gè)效果。預(yù)覽圖:
1.自定義Button.
/** * 長按連續(xù)響應(yīng)的Button * Created by admin on 15-6-1. */ public class LongClickButton extends Button { /** * 長按連續(xù)響應(yīng)的監(jiān)聽,長按時(shí)將會多次調(diào)用該接口中的方法直到長按結(jié)束 */ private LongClickRepeatListener repeatListener; /** * 間隔時(shí)間(ms) */ private long intervalTime; private MyHandler handler; public LongClickButton(Context context) { super(context); init(); } public LongClickButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public LongClickButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } /** * 初始化監(jiān)聽 */ private void init() { handler = new MyHandler(this); setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { new Thread(new LongClickThread()).start(); return true; } }); } /** * 長按時(shí),該線程將會啟動 */ private class LongClickThread implements Runnable { private int num; @Override public void run() { while (LongClickButton.this.isPressed()) { num++; if (num % 5 == 0) { handler.sendEmptyMessage(1); } SystemClock.sleep(intervalTime / 5); } } } /** * 通過handler,使監(jiān)聽的事件響應(yīng)在主線程中進(jìn)行 */ private static class MyHandler extends Handler { private WeakReference<LongClickButton> ref; MyHandler(LongClickButton button) { ref = new WeakReference<>(button); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); LongClickButton button = ref.get(); if (button != null && button.repeatListener != null) { button.repeatListener.repeatAction(); } } } /** * 設(shè)置長按連續(xù)響應(yīng)的監(jiān)聽和間隔時(shí)間,長按時(shí)將會多次調(diào)用該接口中的方法直到長按結(jié)束 * * @param listener 監(jiān)聽 * @param intervalTime 間隔時(shí)間(ms) */ public void setLongClickRepeatListener(LongClickRepeatListener listener, long intervalTime) { this.repeatListener = listener; this.intervalTime = intervalTime; } /** * 設(shè)置長按連續(xù)響應(yīng)的監(jiān)聽(使用默認(rèn)間隔時(shí)間100ms),長按時(shí)將會多次調(diào)用該接口中的方法直到長按結(jié)束 * * @param listener 監(jiān)聽 */ public void setLongClickRepeatListener(LongClickRepeatListener listener) { setLongClickRepeatListener(listener, 100); } public interface LongClickRepeatListener { void repeatAction(); } }
2.在Activity中調(diào)用:
LongClickButton buttonSub = (LongClickButton) findViewById(R.id.long_click_button1); LongClickButton buttonAdd = (LongClickButton) findViewById(R.id.long_click_button2); final TextView numberTV = (TextView) findViewById(R.id.main_number); //連續(xù)減 buttonSub.setLongClickRepeatListener(new LongClickButton.LongClickRepeatListener() { @Override public void repeatAction() { numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1)); } }, 50); //連續(xù)加 buttonAdd.setLongClickRepeatListener(new LongClickButton.LongClickRepeatListener() { @Override public void repeatAction() { numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) + 1)); } }, 50); //減1 buttonSub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1)); } }); //加1 buttonAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) + 1)); } });
3.很多時(shí)候,長按的事件和普通點(diǎn)擊的事件是一樣的(也就是說,長按相當(dāng)于連續(xù)的快速點(diǎn)擊)。這種情況下,自定義Button可以更加簡潔:即在長按時(shí),連續(xù)的調(diào)用普通的OnClickListener。
public class LongClickButton2 extends Button { /** * 間隔時(shí)間(ms) */ private long intervalTime = 50; private MyHandler handler; public LongClickButton2(Context context) { super(context); init(); } public LongClickButton2(Context context, AttributeSet attrs) { super(context, attrs); init(); } public LongClickButton2(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } /** * 初始化監(jiān)聽 */ private void init() { handler = new MyHandler(this); setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { new Thread(new LongClickThread()).start(); return true; } }); } /** * 長按時(shí),該線程將會啟動 */ private class LongClickThread implements Runnable { private int num; @Override public void run() { while (LongClickButton2.this.isPressed()) { num++; if (num % 5 == 0) { handler.sendEmptyMessage(1); } SystemClock.sleep(intervalTime / 5); } } } /** * 通過handler,使監(jiān)聽的事件響應(yīng)在主線程中進(jìn)行 */ private static class MyHandler extends Handler { private WeakReference<LongClickButton2> ref; MyHandler(LongClickButton2 button) { ref = new WeakReference<>(button); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); LongClickButton2 button = ref.get(); if (button != null) { //直接調(diào)用普通點(diǎn)擊事件 button.performClick(); } } } public void setIntervalTime(long intervalTime) { this.intervalTime = intervalTime; } }
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android布局layout技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- Android使用addView動態(tài)添加組件的方法
- android ListView內(nèi)數(shù)據(jù)的動態(tài)添加與刪除實(shí)例代碼
- Android動態(tài)添加menu菜單的簡單方法
- 在Android中動態(tài)添加Panel框架的實(shí)現(xiàn)代碼
- Android 動態(tài)添加Fragment的實(shí)例代碼
- Android用RecyclerView實(shí)現(xiàn)動態(tài)添加本地圖片
- Android動態(tài)添加view的方法示例
- Android實(shí)現(xiàn)圓角Button按鈕
- Android開發(fā)中button按鈕的使用及動態(tài)添加組件方法示例
相關(guān)文章
Android中關(guān)于定時(shí)任務(wù)實(shí)現(xiàn)關(guān)閉訂單問題
在電商、支付等領(lǐng)域,往往會有這樣的場景,用戶下單后放棄支付了,那這筆訂單會在指定的時(shí)間段后進(jìn)行關(guān)閉操作,細(xì)心的你一定發(fā)現(xiàn)了像某寶、某東都有這樣的邏輯,而且時(shí)間很準(zhǔn)確,誤差在1s內(nèi);那他們是怎么實(shí)現(xiàn)的呢?今天通過本文學(xué)習(xí)定時(shí)任務(wù)實(shí)現(xiàn)關(guān)閉訂單問題2022-05-05Android基礎(chǔ)之startActivityForResult()的用法詳解
這篇文章主要給大家介紹了Android中startActivityForResult()的用法,文中給出了詳細(xì)的介紹與示例代碼,相信對大家的理解和學(xué)習(xí)具有一定參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。2017-01-01Android自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-08-08Android自定義ListView實(shí)現(xiàn)下拉刷新上拉加載更多
Listview現(xiàn)在用的很少了,基本都是使用Recycleview,但是不得不說Listview具有劃時(shí)代的意義,我們可以自己添加下拉刷新,上拉加載更多功能。本文就來利用自定義ListView實(shí)現(xiàn)下拉刷新上拉加載更多效果,需要的可以參考一下2022-10-10基于Android中獲取資源的id和url方法總結(jié)
下面小編就為大家分享一篇基于Android中獲取資源的id和url方法總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02Android Handler runWithScissors 梳理流程解析
這篇文章主要為大家介紹了Android Handler runWithScissors 梳理流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Android實(shí)現(xiàn)底部帶刻度的進(jìn)度條樣式
由于公司需要一個(gè)帶刻度的進(jìn)度條樣式,因?yàn)榭潭刃枰獎討B(tài)去改變,所以換背景圖片的方案肯定是不行的,唯一的辦法就是自己繪制一個(gè)進(jìn)度條,下面小編給大家?guī)砹薃ndroid實(shí)現(xiàn)底部帶刻度的進(jìn)度條樣式及實(shí)例代碼,需要的朋友參考下吧2019-10-10Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)信息需要在AndroidManifest.xml文件中加入相應(yīng)的權(quán)限,接下來詳細(xì)介紹Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài),感興趣的朋友可以參考下2012-12-12