728x90
한빛아카데미 Android Studio를 활용한 안드로이드 프로그래밍 6판
p.349 직접 풀어보기 8-2
[실습 8-2]를 다음과 같이 수정하라.
- 버튼 사이에 '현재 그림 번호/전체 그림 개수' 텍스트뷰가 나타나게 한다.
- 토스트 메세지를 없애고, 첫 번째 그림에서 <이전 그림>을 클릭하면 마지막 그림이, 마지막 그림에서 <다음 그림>을 클릭하면 첫 번째 그림이 나오게 한다.
코드
activity_main.xml
<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="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btnPrev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="1dp"
android:layout_weight="1"
android:text=" 이전 그림 " />
<TextView
android:id="@+id/tvNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="1dp"
android:layout_weight="1"
android:gravity="center"
android:text="0/0"
android:textSize="20dp"/>
<Button
android:id="@+id/btnNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="1dp"
android:layout_weight="1"
android:text=" 다음 그림 " />
</LinearLayout>
<com.cookandroid.test.MyPictureView
android:id="@+id/myPictureView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity.java
package com.cookandroid.test;
import java.io.File;
import java.io.FileFilter;
import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button btnPrev, btnNext;
MyPictureView myPicture;
int curNum;
File[] imageFiles;
String imageFname;
TextView tvNumber;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("간단 이미지 뷰어(수정)");
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.WRITE_EXTERNAL_STORAGE},MODE_PRIVATE);
btnPrev = findViewById(R.id.btnPrev);
btnNext = findViewById(R.id.btnNext);
myPicture = findViewById(R.id.myPictureView1);
tvNumber = (TextView) findViewById(R.id.tvNumber);
imageFiles = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/Pictures").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return !file.getName().startsWith(".");
}
});
imageFname = imageFiles[0].toString();
myPicture.imagePath=imageFname;
tvNumber.setText("1" + "/" + imageFiles.length);
btnPrev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (curNum <= 0) {
curNum = imageFiles.length - 1;
} else {
curNum--;
}
imageFname = imageFiles[curNum].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
tvNumber.setText((curNum + 1) + "/" + imageFiles.length);
}
});
btnNext.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (curNum >= imageFiles.length - 1) {
curNum = 0;
} else {
curNum++;
}
imageFname = imageFiles[curNum].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
tvNumber.setText((curNum + 1) + "/" + imageFiles.length);
}
});
}
}
MyPictureView.java
package com.cookandroid.test;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
public class MyPictureView extends View {
String imagePath = null;
public MyPictureView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
canvas.drawBitmap(bitmap, 0, 0, null);
bitmap.recycle();
}
}
}
결과
728x90
'개발 > 책' 카테고리의 다른 글
[안드로이드 프로그래밍] 9장 직접 풀어보기 9-1 (0) | 2021.11.11 |
---|---|
[명품 웹 프로그래밍] 7장 Open Challenge (0) | 2021.11.08 |
[명품 웹 프로그래밍] 6장 Open Challenge (0) | 2021.11.07 |