如何在长按按钮时发送字符流

Posted

技术标签:

【中文标题】如何在长按按钮时发送字符流【英文标题】:How to send a stream of characters on long press of button 【发布时间】:2016-05-25 06:55:54 【问题描述】:

。 这是按钮LongClick的代码,

btnDown.setOnLongClickListener(new View.OnLongClickListener() 
        @Override
        public boolean onLongClick(View v) 
            sendMessage("S");//Here I wanted to send for example SSSSS on long press of that button
        
    );

我想在长按按钮时发送一个字符流,直到用户释放按钮。

【问题讨论】:

您是否考虑过触地和向上操作? 不。我有按钮。单击按钮时,我需要执行此操作。 您可以轻松地为按钮添加一个触摸监听器。 ***.com/questions/11779082/… 没关系。我可以使用 click ClickListeners 按钮,但我的问题是, 【参考方案1】:

像这样尝试自定义Listner

    String mString="";

public class ContinousRepeatListener implements View.OnTouchListener 

private Handler handler = new Handler();

private int initialInterval;
private final int normalInterval;
private final View.OnClickListener clickListener;

private Runnable handlerRunnable = new Runnable() 
    @Override
    public void run() 
        handler.postDelayed(this, normalInterval);
        clickListener.onClick(downView);
    
;

private View downView;

/**
 * @param initialInterval The interval after first click event
 * @param normalInterval The interval after second and subsequent click 
 *       events
 * @param clickListener The OnClickListener, that will be called
 *       periodically
 */
public ContinousRepeatListener (int initialInterval, int normalInterval, 
        View.OnClickListener clickListener) 
    if (clickListener == null)
        throw new IllegalArgumentException("null runnable");
    if (initialInterval < 0 || normalInterval < 0)
        throw new IllegalArgumentException("negative interval");

    this.initialInterval = initialInterval;
    this.normalInterval = normalInterval;
    this.clickListener = clickListener;


public boolean onTouch(View view, MotionEvent motionEvent) 
    switch (motionEvent.getAction()) 
    case MotionEvent.ACTION_DOWN:
        handler.removeCallbacks(handlerRunnable);
        handler.postDelayed(handlerRunnable, initialInterval);
        downView = view;
        downView.setPressed(true);
        clickListener.onClick(view);
        return true;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        handler.removeCallbacks(handlerRunnable);
        downView.setPressed(false);
        downView = null;
        return true;
    

    return false;



并像这样使用

 btnDown.setOnTouchListener(new ContinousRepeatListener(400, 100, new  View.OnClickListener() 
        @Override
        public void onClick(View view) 
            // the code to execute repeatedly
            mString += "S";
            tvString.setText(mString);
        
    ));

【讨论】:

每次字符串长度为 736 时,都不会发生长按。我希望按钮的工作方式与键盘键的工作方式相同。【参考方案2】:

使用 setOnTouchListener 并在 ACTION_DOWN 上写下你的 sendMessage 代码

【讨论】:

我有 4 个按钮,如左、右、下和上。有没有办法使用LongClickListeners

以上是关于如何在长按按钮时发送字符流的主要内容,如果未能解决你的问题,请参考以下文章

Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十三)定义一个avro schema使用comsumer发送avro字符流,producer接受avro字符流并解析(示例代码

长按手势在 UIButton 中显示图像

UIAlertView 警报在长按手势识别器中重复三次

UIAlertView 警报在长按手势识别器中重复三次

TCP网络通信编程(字符流)-Socket应用

TCP网络通信编程(字符流)-Socket应用