public static Bitmap bitmap;
//得到当前摄像头图片信息
public void getBitmap() {
        bitmap = cameraCommandUtil.httpForImage(FirstActivity.IPCamera);
        phHandler.sendEmptyMessage(10);
    }
// 开启线程接受摄像头当前图片(实时接收)
    private Thread phThread = new Thread(new Runnable() {
        public void run() {
            while (true) {
                getBitmap();
            }
        }
    });
//显示图片
@SuppressLint("HandlerLeak")
    private Handler phHandler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 10) {
                 image_show.setImageBitmap(bitmap);
            }
        }
    };       根据上面的代码可以实时一帧一帧地显示出拍摄到的画面,我觉得可以实时显示是因为用了线程的原因?就是每次都sendmessage,然后每次都判断message是否为接收图片时的message,然后就一直动态一帧一帧地显示出来。还请大牛解答。
      然后是我现在想添加一个Button,当我按下button时才完成上面的操作,也就是当我按下button时能够实时地显示画面。

private class xiangying1 implements View.OnClickListener{
        @Override
        public void onClick(View v){
            image_show.setImageBitmap(bitmap);
        }
    }      我按照这样直接image_show,当我按下按钮时只能显示一张照片,相当于拍照,而且程序会卡住。我是应该在button里面添加线程吗?
      希望大家可以解答,谢谢各位~

解决方案 »

  1.   

    你的phHandler 是在哪start的,放到onclick里面就是了
      

  2.   

    您好,不太明白您的意思,怎么放到onclick里面呢?是说在onclick里面写phHandler.start()吗? 
      

  3.   

    您好,不太明白您的意思,怎么放到onclick里面呢?是说在onclick里面写phHandler.start()吗?
      

  4.   

    你可以在activity运行时就开启一个线程,实时获取 图像,将最新的图像赋予一个 Bitmap 变量,当你点击 button时,显示这个bitmap就行
      

  5.   

    您说的这个好像就是我现在写的,我现在点击就是显示bitmap,但这样只能显示一次,而且会卡住
      

  6.   

    你用这篇文章,导出日志看看看  https://jianpanwuzhe.blog.csdn.net/article/details/86611224
      

  7.   

    你用这篇文章,导出日志看看看  https://jianpanwuzhe.blog.csdn.net/article/details/86611224好的 谢谢您
      

  8.   

    你说相机图片展示吧,用imageview当然卡了,每秒n多次。
    频繁的绘制是SurfaceView做的,你百度一下就知道了
      

  9.   

    bottom 添加线程
      

  10.   

    设置个flag,通过boolean值去控制button进行开启显示和停止显示.
      

  11.   

    给你提供一个思路: 这是我程序中的一段代码,功能和你描述的好像类似: @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.camera_toggle://是一个ImageButton
                    boolean toggle = toggleSP.getBoolean("toggle", false);//通过Sharedpreference保存flag值
                    if (toggle) {
                        toggleSP.edit().putBoolean("toggle", false).apply();
                        synchronized (mSync) {
                            if (mCamera != null) {
                                mCamera.stopPreview();//调用摄像头停止预览
                            }
                            if (mMonitor != null) {
                                mMonitor.unregister();
                            }
                        }
                    } else {
                        toggleSP.edit().putBoolean("toggle", true).apply();
                        mMonitor.register();
                        synchronized (mSync) {
                            if (mCamera != null) {
                                mCamera.startPreview();//摄像头开启预览
                            }
                        }
                    }
                    break;
      

  12.   

    onClick里面只调用了一次 image_show.setImageBitmap(bitmap);所以当然只会显示一次啊。另外可以用SurfaceView预览,就不怎么卡了。
      

  13.   

    bottom 添加线程button是不是只能添加一个线程?这个代码里好像有两个线程,一个是接收,另一个是显示