【问题标题】:how automatically perform touch in android programmatically如何以编程方式在android中自动执行触摸
【发布时间】:2015-02-13 11:00:01
【问题描述】:

我有一个RelativeLayout 我想在不触摸屏幕的情况下执行一个触摸事件想要给出一个Toast 消息如果它真的被触摸了。请抛出我已经尝试过下面的它似乎不起作用

MotionEvent event = MotionEvent.obtain(downTime, eventTime, action, 
                                       x, y, pressure, size, 
                                       metaState, xPrecision, yPrecision, 
                                       deviceId, edgeFlags);
onTouchEvent(event);

【问题讨论】:

  • 如何在不触摸屏幕的情况下执行触摸事件!!!?就像不张嘴吃东西一样。
  • 你用过robotium之类的工具吗???
  • @Apurva 在接受的答案中查看开发人员如何在不接触的情况下进行操作..
  • 是的,我现在知道了

标签: android


【解决方案1】:

在活动中找到你的布局

RelativeLayout layout=(RelativeLayout)findviewbyid(R.id.relativelayout);

layout.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            // TODO Auto-generated method stub
            //do your work
            return false;

        }
    });

【讨论】:

  • 但是在这段代码中它会自动触摸的地方。我的理解是如果我触摸视图那么它会调用 onTouch() 对吗???
  • 是的,如果您触摸特定视图,则调用它
【解决方案2】:

你不应该那样做。如果您确实想以编程方式“触摸”您的视图,您应该将 onTouch 方法中发生的任何事情包装在另一个函数中(没有 MotionEvent 参数)并在您想要触摸您的视图时调用该函数。在没有真正触摸的情况下调用 onTouch 会给你带来负面的风格点

@Override
boolean onTouch(View v, MotionEvent me) {
  return action(me.getX(),me.getY());
}

boolean action(int x, int y) {
  //do some stuff
}

void somewhereelse() {
  //Perform touch action
  action(0,0);
}

如果你真的想“调度”一个触摸事件。你这样做:

View v;
v.dispatchTouchEvent(MotionEvent.obtain(0,0,MotionEvent.ACTION_DOWN, 100,100,0.5f,5,0,1,1,0,0));

这些值是相当随机的。只有 deviceId=0 表示它是以编程方式调度的 Touch。

【讨论】:

  • 不会的。我的重点是,如果不触摸屏幕,则永远不应该执行 onTouch 方法。
  • 你是对的,但我的问题是没有触及视图..但是你的意见是什么?
  • 触摸视图后@Override boolean onTouch(MotionEvent me) { return action(me.getX(),me.getY()); } 不打电话
  • 尝试将 MotionEvent.ACTION_DOWN 更改为 MotionEvent.ACTION_UP 以模拟真实的触摸,这对 webviews 很有好处,因为它们只会对 ACTION_UP 做出反应 我强烈建议您不要在广告上尝试此操作,因为它们会发现.
【解决方案3】:

试试这个

 Button btnTouch = (Button) findViewById(R.id.btn_touch);
            btnTouch.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    x++;
                    y++;
                    perFromTouch(x,y);
                }
            });

     private void perFromTouch(float x, float y) {

            // Obtain MotionEvent object
            long initTime = android.os.SystemClock.uptimeMillis();
            long eventTime = android.os.SystemClock.uptimeMillis() + 100;


            // List of meta states found here:     developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
            int metaState = 0;
            MotionEvent motionEvent = MotionEvent.obtain(
                    initTime,
                    eventTime,
                    MotionEvent.ACTION_UP,
                    x,
                    y,
                    metaState
            );
            motionEvent.setSource(inputSource);
            v.dispatchTouchEvent(motionEvent);
        }

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2017-12-14
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多