【问题标题】:How continue updating screen without flooding onTouchEvent ? (android SurfaceView)如何在不泛滥 onTouchEvent 的情况下继续更新屏幕? (安卓表面视图)
【发布时间】:2011-06-15 14:25:48
【问题描述】:

当您有一个用于动画/游戏/...的surfaceView 类时,您在同一个类中有onTouchEvent() 方法和绘图/屏幕刷新方法。现在我只想让 onTouchEvent 方法休眠,这样它就不会被每秒调用 +-80 次并淹没 cpu(并因此导致延迟)。问题是,如果我睡这堂课,它也会停止绘制/更新/刷新。有什么好的解决方案?

编辑
@tanner,这确实是我正在尝试的,以阻止 onTouchEvent() 被过于频繁地调用。我的尝试:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("firstTest",Integer.toString(event.getAction()));   //shows up
    if (!sleeper.CurrentlySleeping) {
        Log.d("2ndTest",Integer.toString(event.getAction())); //not showing up
        ~~  some calculations and stuff  ~~

public class TouchSleeper extends Thread {
// If Thread is sleeping or not.
public static Boolean CurrentlySleeping;
public TouchSleeper() {
    CurrentlySleeping = false;
    this.setPriority(MIN_PRIORITY);
    }

@Override
public void run() {
    try {
        while (true) {
            CurrentlySleeping = true;
            TouchSleeper.sleep(50);
            CurrentlySleeping = false; }
        ~end~

首先是我的 SurfaceView 类中的一段代码。类/线程的第二部分,一直在改变一个布尔值。注意我的第一个 Log.d 是如何返回一些东西的,而第二个没有。这告诉我 CurrentSleeping 永远不会是假的?我还没有弄清楚……?

【问题讨论】:

    标签: android multithreading animation sleep surfaceview


    【解决方案1】:

    看看这个:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
    
        if (action == MotionEvent.ACTION_UP) {
            // Do something here
        }
    }
    

    还可以查看MotionEvent javadoc,了解不同事件类型的说明。

    通过覆盖onTouchEvent,您可以控制该方法中发生的事情。你可以在你的 Activity (boolean touchEnabled = true) 中设置一个标志并检查onTouchEvent()

    if (!touchEnabled) {
        return;
    }
    
    // continue with whatever you wanted to do.
    
    // Remove the following line if you don't want to pass the event to the parent.
    super.onTouchEvent(event);
    

    更新

    如果您的问题只是 onTouchEvent() 触发太快,那么您可以执行以下操作:

    private long lastTime = -1;
    
    private long threshold = 1000;
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        long now = System.currentTimeMillis();
        if (lastTime > -1 && (now - lastTime) < threshold) {
            // Return if a touch event was receive less than "threshold" time ago
            return;
        }
    
        lastTime = now;
    
        super.onTouchEvent(event);
    }
    

    【讨论】:

    • @usealbarazer 在我了解您在应用程序中尝试做什么之前,我无法真正给您答案。什么时候控制onTouchEvent() 什么时候应该触发或者什么时候不应该触发?我可以告诉你,你不想按照你的建议循环,因为这会导致应用程序变得无响应。我发布了我的答案的更新,看看那个。
    • @usealbarazer 现在有更新...刚开始我的更新无法通过。
    • 迟到的问题:难道没有办法降低 onTouchEvent 的调用频率,而不是仅仅阻塞方法体中的代码吗?导致性能下降的主要原因是 onTouchEvent() 甚至被 android 如此频繁地调用。
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多