728x90
오늘은 SubsamplingScaleImageView 와 glide를 활용해 갤러리에 있는 이미지를 가져와 확대, 축소 하는 기능을 구현해 보겠습니다.
라이브러리 추가
build.gradle(module) 의 dependency 내부에 SubsamplingScaleImageView , glide 라이브러리를 추가합니다. gradle 사용 환경에 맞춰 입력하세요.
또는
=> 라이브러리 버전은 아래링크에서 확인해 주세요
glide
https://github.com/bumptech/glide
SubsamplingScaleImageView
https://github.com/davemorrissey/subsampling-scale-image-view?tab=readme-ov-file
권한 설정
AndroidManifest.xml 파일에 아래의 권한 사용 설정을 해주세요
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
레이아웃 xml 파일 코드(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
액티비티 자바 코드
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private SubsamplingScaleImageView imageView; //이미지를 보여주고 확대, 축소할 뷰입니다
private ActivityResultLauncher<Intent> imagePickerLauncher; //이미지 선택 후 결과 데이터를 받아올 때 활용할 launcher 객체입니다
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
setupImagePickerLauncher(); // 이미지 선택 후 결과 데이터를 받아왔을때 처리 셋팅
if (checkStoragePermission()) { //외부저장소 읽기 권한 허용 여부 체크
selectImage(); // 이미지 선택창으로 이동
} else {
requestStoragePermission(); // 권한 요청
}
}
private void setupImagePickerLauncher() {
//이미지 선택 후 결과 데이터를 받아왔을때 SubsamplingScaleImageView에 보여줄 이미지를 설정하는 launcher 객체를 초기화 하는 메서드입니다
imagePickerLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
Uri imageUri = result.getData().getData();
loadImage(imageUri);
}
}
);
}
private void selectImage() {
//이미지 선택창으로 이동하는 메서드입니다.
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
imagePickerLauncher.launch(intent);
}
private void loadImage(Uri imageUri) {
//선택한 이미지의 Uri와 glide를 활용해 SubsamplingScaleImageView에 로드하는 메서드 입니다.
Glide.with(this)
.download(imageUri)
.into(new CustomTarget<File>() {
@Override
public void onResourceReady(File resource, Transition<? super File> transition) {
//리소스의 로드가 완료되었을때 호출되는 메서드
//즉, 해당 리소스를 사용할 준비가 된 상태
imageView.setImage(ImageSource.uri(Uri.fromFile(resource)));
}
@Override
public void onLoadCleared(@Nullable android.graphics.drawable.Drawable placeholder) {
// 리소스의 로드를 취소, 리소스 사용 해제 되었을때 호출되는 메서드
//이 리소스를 활용하는 뷰를 다시 그린다거나 visibility가 변할때
//이 리소스를 활용하는 뷰에게서 리소스 사용하는것을 해제 시켜야함
}
});
}
private boolean checkStoragePermission() { //권한 허용여부를 체크하는 메서드입니다
return ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
private void requestStoragePermission() { //권한 요청 다이얼로그 띄우는 메서드입니다
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// 권한 허용 처리 결과에 따른 동작 메서드 입니다
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_EXTERNAL_STORAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 권한이 허용되었을 때 이미지 선택창 호출
selectImage();
} else {
// 권한이 거부되었을 때 사용자에게 정보 제공
Toast.makeText(this, "권한이 거부되었습니다. 권한 허용 후 다시 앱을 실행해 주세요", Toast.LENGTH_SHORT).show();
}
}
}
}
실행 영상
이미지 확대, 축소가 가능한 것을 볼 수 있습니다
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android]Gson 라이브러리 활용하여 JSON 문자열 다루기 (0) | 2024.06.19 |
---|---|
[JAVA][Android] TedImagePicker 라이브러리로 이미지 여러장 가져오기 (2) | 2024.06.16 |
[JAVA][Android] TedImagePicker 라이브러리로 이미지 1개 가져오기 (0) | 2024.06.11 |
[JAVA][Android]<string> 태그 활용하기 (0) | 2024.06.08 |
[JAVA][Android]textwatcher 활용해 글 변경 반응하기 (0) | 2024.06.04 |