将图像文件加载到图像视图

时间:2018-01-11 17:18:57

标签: java android xml

所以,我(还)尝试构建一个简单的相机应用程序,到目前为止我所拥有的是一个能够拍照的图像控制器,将其保存到存储中并通过意图传递文件路径另一项活动。

在我的新活动中,我要实现的第一步是,将我的最终图像加载到ImageView中,所以我做了以下内容:

const Items = [{
    parentValidators: [{
      isValid: true
    }, {
      isValid: false
    }, {
      isValid: false
    }]
  },
  {
    parentValidators: [{
      isValid: true
    }, {
      isValid: false
    }, {
      isValid: false
    }]
  }
]

// i tried : 
function validateSection() {
  return Items.every(validators => validators.parentValidators.some(i => i.isValid));
}

console.log(validateSection())

但是,它不起作用,我不太清楚为什么不...... :(活动开始完全正常,但ImageView什么都不做。

2 个答案:

答案 0 :(得分:1)

在Android中保存图片的过程中,您必须了解的一些内容

ccv2WithPreview.takePicture();

在这一行中,执行的方法是

public void takePicture() {
    try {
        // This is how to tell the camera to lock focus.
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
        // Tell #mCaptureCallback to wait for the lock.
        mState = STATE_WAITING_LOCK;
        mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, backgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    Toast.makeText(activity.getApplicationContext(), file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
}

在此方法中,capture()调用是异步的。由于您在调用它并开始新的Activity之后很快就会结束活动,所以当您的代码将图像保存在Image Saver中时,您已经开始使用新的Activity并且您的文件尚未就绪。

按钮实现有效,因为当您单击按钮时,图像将被保存。

要解决此问题,

<强> CameraHelper.java

public interface CameraHelper{
    void fileSaved(String filePath);
}

<强> MainActivity.java

public class MainActivity extends AppCompatActivity
        implements SensorEventListener, ActivityCompat.OnRequestPermissionsResultCallback, CameraHelper{
    ...
    @Override
    public void fileSaved(String file){
        Intent intent = new Intent(this, AfterActivity.class);
        intent.putExtra("filePath", file);
        startActivity(intent);
        finish();
    }
}

在MainActivity的onCreate

ccv2WithPreview = new CameraControllerV2WithPreview(MainActivity.this, textureView, MainActivity.this);

在相机课程中

private CameraHelper cameraHelper; //Initialize in constructor

然后在ImageSaver中

private boolean imageSaved = false;
public void run() {
    if(!imageSaved) {
        ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
        byte[] bytes = new byte[buffer.remaining()];
        buffer.get(bytes);
        try (FileOutputStream output = new FileOutputStream(mFile)) {
            output.write(bytes);
            imageSaved = true;
            cameraHelper.fileSaved(mFile.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            mImage.close();
        }
    }
}

这是您必须处理将来获得的任何异步任务的方法。基于回调的实现。

答案 1 :(得分:0)

设置位图后,您可以尝试invalidate() ImageView吗?

(我在这里猜很多,但几年前使用GUI,我记得如果一个视图发生了变化,你必须告诉视图,以便重新绘制它。)< / p>

另请参阅:How to refresh image view immediately