实现 点击增加数字,长按一直增加数字 功能。同时对某个按钮实现

大概就是对某个部件实现点击和长按功能,点击数字变化一次,长按一直增加,松开停止。

新建一个类CounterHandler


import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by Noman on 11/8/2016.
 */
public class CounterHandler {
    final Handler handler = new Handler();
    private View incrementalView;
    private View decrementalView;
    private float minRange = -1;
    private float maxRange = -1;
    public float startNumber = 0;
    private float counterStep = 1;
    private int counterDelay = 50; //millis

    private boolean isCycle = false;
    private boolean autoIncrement = false;
    private boolean autoDecrement = false;

    private CounterListener listener;

    private Runnable counterRunnable = new Runnable() {
        @Override
        public void run() {
            if (autoIncrement) {
                increment();
                handler.postDelayed(this, counterDelay);
            } else if (autoDecrement) {
                decrement();
                handler.postDelayed(this, counterDelay);
            }
        }
    };

    private CounterHandler(Builder builder) {
        incrementalView = builder.incrementalView;
        decrementalView = builder.decrementalView;
        minRange = builder.minRange;
        maxRange = builder.maxRange;
        startNumber = builder.startNumber;
        counterStep = builder.counterStep;
        counterDelay = builder.counterDelay;
        isCycle = builder.isCycle;
        listener = builder.listener;

        initDecrementalView();
        initIncrementalView();

        if (listener != null) {
            listener.onIncrement(incrementalView, startNumber);
            listener.onDecrement(decrementalView, startNumber);
        }
    }

    private void initIncrementalView() {
        incrementalView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                increment();
            }
        });

        incrementalView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                autoIncrement = true;
                handler.postDelayed(counterRunnable, counterDelay);
                return false;
            }
        });
        incrementalView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP && autoIncrement) {
                    autoIncrement = false;
                }
                return false;
            }
        });

    }

    private void initDecrementalView() {
        decrementalView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                decrement();
            }
        });

        decrementalView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                autoDecrement = true;
                handler.postDelayed(counterRunnable, counterDelay);
                return false;
            }
        });
        decrementalView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP && autoDecrement) {
                    autoDecrement = false;
                }
                return false;
            }
        });

    }

    private void increment() {
        float number = startNumber;

        if (maxRange != -1) {
            if (number + counterStep <= maxRange) {
                number += counterStep;
            } else if (isCycle) {
                number = minRange == -1 ? 0 : minRange;
            }
        } else {
            number += counterStep;
        }

        if (number != startNumber && listener != null) {
            startNumber = number;
            VideoPlayerActivity.player.setPlaybackSpeed(number);
            listener.onIncrement(incrementalView, startNumber);
        }

    }

    private void decrement() {
        float number = startNumber;

        if (minRange != -1) {
            if (number - counterStep >= minRange) {
                number -= counterStep;
            } else if (isCycle) {
                number = maxRange == -1 ? 0 : maxRange;

            }
        } else {
            number -= counterStep;
        }

        if (number != startNumber && listener != null) {
            startNumber = number;
            VideoPlayerActivity.player.setPlaybackSpeed(number);
            listener.onDecrement(decrementalView, startNumber);
        }
    }

    public interface CounterListener {
        void onIncrement(View view, float number);

        void onDecrement(View view, float number);

    }

    public static final class Builder {
        private View incrementalView;
        private View decrementalView;
        private float minRange=-1;
        private float maxRange=-1;
        private float startNumber=0;
        private float counterStep =1;
        private int counterDelay=50;
        private boolean isCycle;
        private CounterListener listener;

        public Builder() {
        }

        public Builder incrementalView(View val) {
            incrementalView = val;
            return this;
        }

        public Builder decrementalView(View val) {
            decrementalView = val;
            return this;
        }

        public Builder minRange(float val) {
            minRange = val;
            return this;
        }

        public Builder maxRange(float val) {
            maxRange = val;
            return this;
        }

        public Builder startNumber(float val) {
            startNumber = val;
            return this;
        }

        public Builder counterStep(float val) {
            counterStep = val;
            return this;
        }

        public Builder counterDelay(int val) {
            counterDelay = val;
            return this;
        }

        public Builder isCycle(boolean val) {
            isCycle = val;
            return this;
        }

        public Builder listener(CounterListener val) {
            listener = val;
            return this;
        }

        public CounterHandler build() {
            return new CounterHandler(this);
        }
    }
}

然后在你的mainActivity直接实现接口

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class CounterExampleActivity extends AppCompatActivity implements CounterHandler.CounterListener{

    TextView txtCounter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_counter_example);

        Button buttonPlus = (Button) findViewById(R.id.buttonPlus);
        Button buttonMinus = (Button) findViewById(R.id.buttonMinus);
        txtCounter = (TextView) findViewById(R.id.txtCounter);

        new CounterHandler.Builder()
                .incrementalView(buttonPlus)  //增加按钮
                .decrementalView(buttonMinus)   //减少按钮
                .minRange(-50) // 区间下限
                .maxRange(50) // 区间上限
                .isCycle(true) // 是否在区间循环
                .counterDelay(200) // 长按增加速度
                .counterStep(2)  // 每次增加步长
                .listener(this) // 添加监听
                .build();

    }

    @Override
    public void onIncrement(View view, long number) {
        txtCounter.setText(String.valueOf(number));
    }

    @Override
    public void onDecrement(View view, long number) {
        txtCounter.setText(String.valueOf(number));
    }
}

这个可以适用于任何部件,只要能点击就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值