본문 바로가기

동방프로젝트

실습, 직풀 8-2)

package com.example.helloandroid;

import android.Manifest;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.io.File;

@SuppressWarnings("deprecation")
/*
sd카드 특정 폴더의 이미지 파일을 보여주는 간단한 이미지 뷰어
기본제공 위젯만으로는 해결 불가. 커스텀위젯을 만들어,
activity_mail.xml에 넣는다.
여기서 만들 커스텀 위젯은, 지정된 이미지 파일을 출력하는 역할을 맡음.

그림파일을 sd카드에 넣어둔 다음, device file explorer에서 sdcard/pictures에 사진을 넣어둔다.
androidManifest.mxl파일에 sd카드를 사용할 수 있도록 퍼미션을 지정하자.

직풀은, 위의 실습을, 버튼 사이에 "현 그림 번호/전체 그림 개수" 텍스트뷰가
나타나게 한다.
토스트메시지를 없애고, 첫번째 그림에서 이전 그림을 클릭시 마지막 그림이, 마지막 그림에서
다음 그림을 클릭시 첫번째 그림이 나오게 한다.
*/
public class MainActivity extends AppCompatActivity {
Button btnPrev, btnNext;
myPictureView myPicture;
int curNum;
File[] imageFiles;
String imageFname;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("간단 이미지 뷰어");

ActivityCompat.requestPermissions(this, new String[] {Manifest
.permission.WRITE_EXTERNAL_STORAGE}, MODE_PRIVATE);
btnNext = (Button) findViewById(R.id.btnNext);
btnPrev = (Button) findViewById(R.id.btnPrev);
myPicture = (myPictureView) findViewById(R.id.myPictureView1);

//sd카드에서 파일을 읽어 listFiles()로 배열을 만들고
//첫 번째 파일의 이름을 추출해 mypictures 클래스의 imagepathd에 전달.
//그럼 첫번째 그림이 화면에 출력된다.
imageFiles = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/Pictures").listFiles();
imageFname=imageFiles[0].toString();
myPicture.imagePath=imageFname;


btnPrev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (curNum <= 0) {
Toast.makeText(getApplicationContext(), "첫번째 그림입니다",
Toast.LENGTH_SHORT).show();
} else {
curNum--;
imageFname = imageFiles[curNum].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
}
}
});

btnNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (curNum >=imageFiles.length-1) {
Toast.makeText(getApplicationContext(), "마지막 그림입니다",
Toast.LENGTH_SHORT).show();
} else {
curNum++;
imageFname = imageFiles[curNum].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
}
}
});
}
}

///////////////////////

(myPictureView.java)

package com.example.helloandroid;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

public class myPictureView extends View {
String imagePath=null;
//myPictrueView에 보여줄 이미지 파일의 경로 및 파일 이름 저장 변수

public myPictureView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);

}

@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//imagePath에 값이 있으면(경로 및 파일 이름이 이미지파일에 지정되엇다면)
//화면에 그림파일을 출력
if(imagePath!=null) {
Bitmap bitmap= BitmapFactory.decodeFile(imagePath);
canvas.drawBitmap(bitmap, 0, 0, null);
bitmap.recycle();
}
}
}

//////////////////////////////////

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnPrev"
android:layout_weight="1"
android:text="이전 그림"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnNext"
android:layout_weight="1"
android:text="다음 그림"/>

</LinearLayout>

<com.example.helloandroid.myPictureView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/myPictureView1"/>

<!--초기엔 버튼은 비활성화상태이다.-->
</LinearLayout>

//////////////////////////////////////////////////////////////직풀///////////////////////////

package com.example.helloandroid;

import android.Manifest;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.io.File;

@SuppressWarnings("deprecation")
/*
sd카드 특정 폴더의 이미지 파일을 보여주는 간단한 이미지 뷰어
기본제공 위젯만으로는 해결 불가. 커스텀위젯을 만들어,
activity_mail.xml에 넣는다.
여기서 만들 커스텀 위젯은, 지정된 이미지 파일을 출력하는 역할을 맡음.

그림파일을 sd카드에 넣어둔 다음, device file explorer에서 sdcard/pictures에 사진을 넣어둔다.
androidManifest.mxl파일에 sd카드를 사용할 수 있도록 퍼미션을 지정하자.

직풀은, 위의 실습을, 버튼 사이에 "현 그림 번호/전체 그림 개수" 텍스트뷰가
나타나게 한다.
토스트메시지를 없애고, 첫번째 그림에서 이전 그림을 클릭시 마지막 그림이, 마지막 그림에서
다음 그림을 클릭시 첫번째 그림이 나오게 한다.
*/
public class MainActivity extends AppCompatActivity {
Button btnPrev, btnNext;
myPictureView myPicture;
int curNum=1;
File[] imageFiles;
String imageFname;
TextView textView1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("간단 이미지 뷰어");

ActivityCompat.requestPermissions(this, new String[] {Manifest
.permission.WRITE_EXTERNAL_STORAGE}, MODE_PRIVATE);
btnNext = (Button) findViewById(R.id.btnNext);
btnPrev = (Button) findViewById(R.id.btnPrev);
myPicture = (myPictureView) findViewById(R.id.myPictureView1);
textView1=(TextView)findViewById(R.id.textview1);

//sd카드에서 파일을 읽어 listFiles()로 배열을 만들고
//첫 번째 파일의 이름을 추출해 mypictures 클래스의 imagepathd에 전달.
//그럼 첫번째 그림이 화면에 출력된다.
imageFiles = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/Pictures").listFiles();
imageFname=imageFiles[0].toString();
myPicture.imagePath=imageFname;


btnPrev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (curNum <= 1) {
curNum=imageFiles.length;
imageFname=imageFiles[curNum-1].toString();
myPicture.imagePath=imageFname;
myPicture.invalidate();
//valueOf를 통해, 스트링을 정수로
textView1.setText(String.valueOf(curNum)+
"/"+String.valueOf(imageFiles.length));

//Toast.makeText(getApplicationContext(), "첫번째 그림입니다",
//Toast.LENGTH_SHORT).show();
} else {
curNum--;
imageFname=imageFiles[curNum-1].toString();
myPicture.imagePath=imageFname;
myPicture.invalidate();
textView1.setText(String.valueOf(curNum)+
"/"+String.valueOf(imageFiles.length));
}
}
});

btnNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (curNum >=imageFiles.length) {
curNum=1;
imageFname=imageFiles[curNum-1].toString();
myPicture.imagePath=imageFname;
myPicture.invalidate();
textView1.setText(String.valueOf(curNum) + "/"
+String.valueOf(imageFiles.length));
// Toast.makeText(getApplicationContext(), "마지막 그림입니다",
// Toast.LENGTH_SHORT).show();
} else {
curNum++;
imageFname = imageFiles[curNum-1].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
}
textView1.setText(String.valueOf(curNum)+"/"+
String.valueOf(imageFiles.length));
}
});
}
}

////////////////////

package com.example.helloandroid;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

public class myPictureView extends View {
String imagePath=null;
//myPictrueView에 보여줄 이미지 파일의 경로 및 파일 이름 저장 변수

public myPictureView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);

}

@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//imagePath에 값이 있으면(경로 및 파일 이름이 이미지파일에 지정되엇다면)
//화면에 그림파일을 출력
if(imagePath!=null) {
Bitmap bitmap= BitmapFactory.decodeFile(imagePath);
canvas.drawBitmap(bitmap, 0, 0, null);
bitmap.recycle();
}
}
}

/.//////////////////////

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnPrev"
android:layout_weight="1"
android:text="이전 그림"/>

<!--텍스트는, 총 쓰일 이미지 n-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1/7"
android:textSize="20sp"
android:id="@+id/textview1"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnNext"
android:layout_weight="1"
android:text="다음 그림"/>

</LinearLayout>

<com.example.helloandroid.myPictureView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/myPictureView1"/>

<!--초기엔 버튼은 비활성화상태이다.-->
</LinearLayout>

'동방프로젝트' 카테고리의 다른 글

그림판 만들기(9-3)  (0) 2020.08.17
실습, 직풀 9-2) 그림판 만들기  (2) 2020.08.17
sd카드 작업 1  (0) 2020.08.16
직풀 8-1  (0) 2020.08.16
실습8-1) 간단한 일기장 앱  (2) 2020.08.16