在android中将图像添加到曲面视图

在android中将图像添加到曲面视图,android,imageview,surfaceview,Android,Imageview,Surfaceview,我想将图像添加到曲面视图。所以我使用下面的代码 public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{ Bitmap myicon; Canvas canvas; private Paint mBitmapPaint; Paint p= new Paint(); @Override protected voi

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

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

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

请解决这个问题


提前谢谢。

您的课程有一些变化

package com.sample; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MSurface extends SurfaceView implements SurfaceHolder.Callback { public MSurface(Context context) { super(context); getHolder().addCallback(this); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap icon = BitmapFactory.decodeResource(getResources(),R.drawable.icon); canvas.drawColor(Color.BLACK); canvas.drawBitmap(icon, 10, 10, new Paint()); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas canvas = null; try { canvas = holder.lockCanvas(null); synchronized (holder) { onDraw(canvas); } } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) { holder.unlockCanvasAndPost(canvas); } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } 包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(此); } @凌驾 受保护的void onDraw(画布){ super.onDraw(帆布); 位图图标=BitmapFactory.decodeResource(getResources(),R.drawable.icon); 画布。drawColor(颜色。黑色); drawBitmap(图标,10,10,new Paint()); } @凌驾 公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){ //TODO自动生成的方法存根 } @凌驾 已创建的公共空白表面(表面持有人){ Canvas=null; 试一试{ canvas=holder.lockCanvas(空); 同步(保持架){ onDraw(帆布); } }捕获(例外e){ e、 printStackTrace(); }最后{ if(canvas!=null){ 支架。解锁画布和立柱(画布); } } } @凌驾 公共空间表面覆盖(表面覆盖物持有人){ //TODO自动生成的方法存根 } } 但我不确定您是否需要SurfaceView,因为它过去不是一次绘制位图,而是在用户交互后绘制很多次

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


干杯

这是你的解决方案,伙计,也请看一下我从中获得解决方案的链接

MainAct.java

public class MainAct extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mySurfaceView mySurfaceView = new mySurfaceView(getApplicationContext());
        setContentView(mySurfaceView);
    }
}
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);
                    }
                }
            }
        }
    }
}
mySurfaceView.java

public class MainAct extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mySurfaceView mySurfaceView = new mySurfaceView(getApplicationContext());
        setContentView(mySurfaceView);
    }
}
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网站不再可用。我找到了另一个有相同来源的网站


我希望这会有帮助

显示如何将曲面视图添加到window@tabbycatMySurfaceView MySurfaceView=newMySurfaceView(此);setContentView(mysurfaceview);大体上activity@Ramakrishna请检查我的工作示例以及我提供的链接。@Ramakrishna您的解决方案花了一些时间,但没关系我也学到了一些新的东西,享受吧,伙计。我们还需要一个您创建的线程来控制绘图部分。我在答案中创造了。不存在任何more@nkvnkv:我添加了具有相同源代码的备选网站。@prafuda每次使用您的代码时,我都会遇到异常,我想在实时摄像头上将透明图像覆盖在我的表面视图上,但每次我的代码都会在这一行崩溃_panel.onDraw(c);有人能解释一下问题是什么吗09-16 11:51:33.257:E/AndroidRuntime(19867):致命异常:Thread-26657 09-16 11:51:33.257:E/AndroidRuntime(19867):java.lang.NullPointerException 09-16 11:51:33.257:E/AndroidRuntime(19867):在com.example.retricaapp.CameraPreview$TutorialThread.run(CameraPreview.java:118)