Android Studio를 활용한 안드로이드 프로그래밍 P382 직접 풀어보기 9-3

*문제에서는 블러링, 엠보싱기능을 추가했지만 저는 실습 문제 그대로 구현했습니다.


아래의 그림처럼 간단한 포토샵 프로그램을 만들어라.

1. 확대, 축소 기능

2. 회전 기능

3. 화면 밝기 증가, 감소

4. 화면 어둡게/밝게 하기


*실행 결과는 일일이 보여드리기가 힘들어서 생략하겠습니다. 직접 돌려보시면 좋을 것 같아여



<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="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:id="@+id/iconLayout"
android:layout_weight="1">
<ImageButton
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/zoomin"
android:src="@drawable/icon_zoomin"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zoomout"
android:src="@drawable/icon_zoomout"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rotate"
android:src="@drawable/icon_rotate"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zoombright"
android:src="@drawable/icon_bright"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zoomdark"
android:src="@drawable/icon_dark"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zoomgray"
android:src="@drawable/icon_ge"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="9"
android:gravity="center"
android:id="@+id/pictureLayout"
android:orientation="vertical"/>
</LinearLayout>


<MainActivity>

1. clickIcons함수를 정의하고 main문에서 호출할 수 있도록 했습니다. 메뉴 클릭 시 각 이벤트를 처리합니다.

2. 맨 마지막 버튼(화면 회색 전환)의 경우 satur값이 1이면 0으로 바꿔 회색화면으로 만들어주고 0일 시 다시 1로 바꿔줍니다.

=> 일종의 토글버튼(on/off)와 비슷합니다. 최초에 버튼 클릭시 회색으로전환, 또 한번 클릭 시 밝게 전환

아래 코드를 정확한 위치에 삽입해야합니다. 다른 위치에 코드 삽입 시 사진이 회색으로 전환되지 않습니다.

if(satur==0)cm.setSaturation(satur);// 위치 여기다가!!


package com.example.p374;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {
ImageButton zoomin,zoomout,zoombright,zoomdark,zoomrotate,zoomgray;
MyGraphicView graphicView;
static float scaleX=1,scaleY=1,angle=0,color=1,satur=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("미니 포토샵");

LinearLayout pictureLayout=(LinearLayout)findViewById(R.id.pictureLayout);
graphicView=(MyGraphicView)new MyGraphicView(this);
pictureLayout.addView(graphicView);
clickIcons();
}

public void clickIcons() {
zoomin=(ImageButton)findViewById(R.id.zoomin);
zoomin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scaleX=scaleX+0.2f;
scaleY=scaleY+0.2f;
graphicView.invalidate();
}
});
zoomout=(ImageButton)findViewById(R.id.zoomout);
zoomout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scaleX=scaleX-0.2f;
scaleY=scaleY-0.2f;
graphicView.invalidate();
}
});
zoomrotate=(ImageButton)findViewById(R.id.rotate);
zoomrotate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
angle=angle+20;
graphicView.invalidate();
}
});
zoombright=(ImageButton)findViewById(R.id.zoombright);
zoombright.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
color=color+0.2f;
graphicView.invalidate();
}
});
zoomdark=(ImageButton)findViewById(R.id.zoomdark);
zoomdark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
color=color-0.2f;
graphicView.invalidate();
}
});
zoomgray=(ImageButton)findViewById(R.id.zoomgray);
zoomgray.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(satur==0)satur=1;
else satur=0;
graphicView.invalidate();
}
});
}


private class MyGraphicView extends View {
public MyGraphicView(Context context) {
super(context);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
float[] array={color,0,0,0,0,
0,color,0,0,0,
0,0,color,0,0,
0,0,0,1,0};
ColorMatrix cm=new ColorMatrix(array);
if(satur==0)cm.setSaturation(satur);// 위치 여기다가!!
paint.setColorFilter(new ColorMatrixColorFilter(cm));

Bitmap picture= BitmapFactory.decodeResource(getResources(),R.drawable.img01);
int picX=(this.getWidth()-picture.getWidth())/2;
int picY=(this.getHeight()-picture.getHeight())/2;
int cenX=this.getWidth()/2;
int cenY=this.getHeight()/2;
canvas.scale(scaleX,scaleY,cenX,cenY);
canvas.rotate(angle,cenX,cenY);
canvas.drawBitmap(picture,picX,picY,paint);
picture.recycle();
}
}
}





'Android Studio를 활용한 안드로이드 프로그래밍' 카테고리의 다른 글

직접 풀어보기 9-2  (0) 2020.06.08
직접 풀어보기 9-1  (0) 2020.06.07
직접 풀어보기 8-2  (15) 2020.05.20
직접 풀어보기 8-1  (0) 2020.05.20
직접 풀어보기 7-3  (0) 2020.05.19

+ Recent posts