【问题标题】:add image to surface view in android在android中将图像添加到表面视图
【发布时间】:2011-12-06 03:25:12
【问题描述】:

我想将图像添加到 Surface 视图。所以我使用了下面的代码

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

     Bitmap myicon;
     Canvas canvas;
     private Paint   mBitmapPaint;

     Paint p= new Paint();


       @Override
        protected void onDraw(Canvas canvas) {
           Bitmap myicon=BitmapFactory.decodeResource(getResources(),R.drawable.icon);
           canvas.drawColor(Color.BLACK);
           canvas.drawBitmap(myicon, 0,0, p);
           // canvas.drawBitmap(myicon, 0,0, null);
           // canvas.drawBitmap(myicon, 25,25, null);
       }
        public MySurfaceView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub

        }

        public void surfaceDestroyed(SurfaceHolder arg0) {
            // TODO Auto-generated method stub

        }
    }

但它显示黑屏。我没有明白我在上面的代码中做错了什么。

请解决问题

提前致谢。

【问题讨论】:

  • 显示您如何将表面视图添加到窗口
  • @tabbycat MySurfaceView mysurfaceview = newMySurfaceView(this);设置内容视图(我的表面视图);在主要活动中
  • @Ramakrishna 查看我的工作示例以及我提供的链接。

标签: android imageview surfaceview


【解决方案1】:

这是您的解决方案,伙计,还请查看我从那里获得 solution 的链接

MainAct.java

public class MainAct extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mySurfaceView mySurfaceView = new mySurfaceView(getApplicationContext());
        setContentView(mySurfaceView);
    }
}

mySurfaceView.java

public class mySurfaceView extends SurfaceView implements
        SurfaceHolder.Callback {

    private TutorialThread _thread;

    public mySurfaceView(Context context) {
        super(context);
        getHolder().addCallback(this);
        _thread = new TutorialThread(getHolder(), this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Bitmap _scratch = BitmapFactory.decodeResource(getResources(),
                R.drawable.icon);
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(_scratch, 10, 10, null);

    }

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    }

    public void surfaceCreated(SurfaceHolder arg0) {
        _thread.setRunning(true);
        _thread.start();
    }

    public void surfaceDestroyed(SurfaceHolder arg0) {
        boolean retry = true;
        _thread.setRunning(false);
        while (retry) {
            try {
                _thread.join();
                retry = false;
            } catch (InterruptedException e) {
            }
        }
    }

    class TutorialThread extends Thread {
        private SurfaceHolder _surfaceHolder;
        private mySurfaceView _panel;
        private boolean _run = false;

        public TutorialThread(SurfaceHolder surfaceHolder, mySurfaceView panel) {
            _surfaceHolder = surfaceHolder;
            _panel = panel;
        }

        public void setRunning(boolean run) {
            _run = run;
        }

        @Override
        public void run() {
            Canvas c;
            while (_run) {
                c = null;
                try {
                    c = _surfaceHolder.lockCanvas(null);
                    synchronized (_surfaceHolder) {
                        _panel.onDraw(c);
                    }
                } finally {
                    if (c != null) {
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }
}

编辑:

droidnova 网站不再可用。我找到了具有相同来源的替代网站here

希望对你有帮助!!

【讨论】:

  • @Ramakrishna 你的解决方案花了一段时间,但没关系我也学到了一些新东西来拥有它,享受吧伙计。
  • 另外,我们需要您创建的用于控制绘图部分的线程。我在答案中创建了。
  • @nkvnkv:我添加了具有相同来源的替代网站。
  • @Prabuddha 每次我使用你的代码时都会遇到异常,我想在实时相机上的表面视图上放置透明图像,但每次我的代码在这一行崩溃_panel.onDraw(c);有人可以详细说明问题 09-16 11:51:33.257: E/AndroidRuntime(19867): FATAL EXCEPTION: Thread-26657 09-16 11:51:33.257: E/AndroidRuntime(19867): java.lang.NullPointerException 09-16 11:51:33.257: E/AndroidRuntime(19867): at com.example.retricaapp.CameraPreview$TutorialThread.run(CameraPreview.java:118)
【解决方案2】:

你的班级有一些变化

包 com.sample;

导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;

公共类 MSurface 扩展 SurfaceView 实现 SurfaceHolder.Callback {

    公共MSurface(上下文上下文){
        超级(上下文);
        getHolder().addCallback(this);
    }

    @覆盖
    受保护的无效onDraw(帆布画布){
        超级.onDraw(画布);
        位图图标 = BitmapFactory.decodeResource(getResources(),R.drawable.icon);
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(icon, 10, 10, new Paint());
    }

    @覆盖
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO 自动生成的方法存根
    }

    @覆盖
    公共无效surfaceCreated(SurfaceHolder持有人){
        画布画布=空;
        尝试 {
            画布 = holder.lockCanvas(null);
            同步(持有人){
                onDraw(画布);
            }
        } 捕捉(异常 e){
            e.printStackTrace();
        } 最后 {
            如果(画布!= null){
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder持有人){
        // TODO 自动生成的方法存根

    }
}

但我不确定你是否需要SurfaceView,因为它过去不是绘制一次位图,而是在用户交互后绘制很多次

如果您的视图不是交互式的,最好扩展 View 而不是 SurfaceView

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多