【问题标题】:Android - wait for touch eventAndroid - 等待触摸事件
【发布时间】:2012-09-11 08:41:06
【问题描述】:

在我的 Android 应用中,我想在屏幕上按顺序显示多张图像,等待触摸事件(单击)转到下一个。我看到here 这样做的一种方法应该是:

public class LoadImage extends Activity {
    private Thread thread; //defined inside the activity

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_load_image);

        [get an image and create a bitmap from it]

        ImageView imageView = (ImageView) findViewById(R.id.imageView);
        imageView.setImageBitmap(bitmap);

        thread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized(this) {
                        wait(100000000); //large number
                    }
                }
                catch(InterruptedException ex) {                    
                }         
            }
        };
        thread.start();    
   }

    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        if (evt.getAction() == MotionEvent.ACTION_DOWN) {
            synchronized (thread) {
                thread.notifyAll();
            }
        }
        return true;
    }
}

但是,此代码似乎只是跳过等待并立即跳转到最后一张图片。它有什么问题,和/或有更好的方法吗?

【问题讨论】:

    标签: android touch-event


    【解决方案1】:

    默认情况下,Android 中的事件侦听器用于等待 - 您不必提供任何延迟。

    只需在 ImageView 上设置 onTouchEvent(...) 侦听器并显示第一个位图。触摸 ImageView 时,显示下一个位图,依此类推。您所要做的就是计算触摸的次数,以便知道要显示哪个图像(图像 1、2、3、4 等)。

    示例...

    public class LoadImage extends Activity {
    
        int imageNumber = 1;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_load_image);
    
            //get an image and create a bitmap from it
    
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
    
       }
    
        @Override
        public boolean onTouchEvent(MotionEvent evt) {
            if (evt.getAction() == MotionEvent.ACTION_DOWN) {
                imageNumber++;
                switch (imageNumber) {
                    case 2:
                        // show image 2
                        break;
                    case 3:
                        // show image 3
                        break;
                    ...
                }
                return true;
            }
            return false;
        }
    }
    

    【讨论】:

    • 好主意,完美运行!由于我的图像来自 OpenCV 处理并且在开始时不会全部可用,因此我在类中添加了一个私有布尔标志 readyToDisplay。完成所有操作后,我将其设置为 true。然后,您的代码变为:if (readyToDisplay && evt.getAction() == MotionEvent.ACTION_DOWN) {.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多