【问题标题】:Android's SurfaceView blinksAndroid SurfaceView 闪烁
【发布时间】:2011-08-17 07:43:45
【问题描述】:

我想创建一个简单的 Android 应用程序,它会在我触摸屏幕的地方绘制圆圈。它正在与 View 一起工作(缓慢),但不与 SurfaceView 一起工作。结果很奇怪——点击时,整个图像都在移动。我也尝试从另一个线程调用绘图函数,但结果是一样的。还发现了另一个具有这种奇怪行为的示例: http://android-er.blogspot.com/2010/05/android-surfaceview.html 我使用 Android 2.3.3,API 级别 10。任何帮助将不胜感激。

package com.samsung.sketchbook;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SketchBook extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BookView bookView = new BookView(this);
        setContentView(bookView);
    }

    class BookView extends SurfaceView implements SurfaceHolder.Callback {

        private SurfaceHolder holder;
        private Paint paint = new Paint();
        private float x, y;

        public BookView(Context context) {
            super(context);
            holder = getHolder();
            holder.addCallback(this);
            paint.setColor(Color.WHITE);
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        public void surfaceCreated(SurfaceHolder holder) {
            Log.d("BookView", "surfaceCreated!");
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }

        @Override
        public boolean onTouchEvent(MotionEvent motionEvent) {
            x = motionEvent.getX();
            y = motionEvent.getY();
            Canvas canvas = holder.lockCanvas(null);
            canvas.drawCircle(x, y, 3, paint);
            holder.unlockCanvasAndPost(canvas);
            return true;
        }

    }

}

【问题讨论】:

  • 哥们,问题解决了吗?

标签: java android surfaceview


【解决方案1】:

我建议你不要使用SurfaceView

我的经验表明,这并不是比View 更好的解决方案。是的,在View 上扩展的实现类很慢,但是只有当你不知道如何有效地使用invalidate() 时。

我的意思是不要使用invalidate()(它绘制所有画布),但是invalidate(dirtyRect)(你定义你想要重绘的矩形,而画布的其余部分和以前一样)它非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2012-08-27
    • 2011-04-04
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多