동방프로젝트

개선그림판 9-3

두원공대88학번뚜뚜 2020. 8. 17. 21:00

package com.example.helloandroid;

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

import androidx.appcompat.app.AppCompatActivity;

@SuppressWarnings("deprecation")

//간단 미니 포토샵 앱.

//직풀은, 푀색 영상 아이콘을 없앤다.
//밝게 하기 아이콘 클릭시 채도가 높아지고, 어둡게 하기 아이콘 선택시 채도가
//낮아지도록.
//블러링, 엠보싱 아이콘을 추가하고, 클릭하면 블러링 또는 엠보싱 기능이 온오프
public class MainActivity extends AppCompatActivity {

ImageButton ibZoomin, ibZoomout, ibRotate, ibBright,
ibDar, ibEmbos, ibBlur;
MyGraphicView graphView;

//아이콘 클릭 시의 내용을 onCreate()에 코딩시 복잡. 따라서
//따로 별개의 메소드를 만든다
static float scaleX =1, scaleY=1;
static float angle=0;
static float color=1;
static boolean blur=false;
static boolean embos= false;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyGraphicView(this));
setTitle("미니 포토샵(개선)");

//pcitureLayout을 인플레이트 후, MyGraphhicView형 클래스변수 첨부
//아래쪽 레이아웃에, MyGraphicView에서 설정한 내용이 출력됨
LinearLayout picturLayout=(LinearLayout)
findViewById(R.id.pictureLayout);
graphView=(MyGraphicView) new MyGraphicView(this);
picturLayout.addView(graphView);

//onCreate안에서 메소드 호출
clickIcons();
}

private void clickIcons() {
ibZoomin=(ImageButton) findViewById(R.id.ibZoomin);
ibZoomin.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
scaleX = scaleX +0.2f;
scaleY=scaleY+0.2f;
graphView.invalidate();
}
});

ibZoomout=(ImageButton) findViewById((R.id.ibZoomin));
ibZoomout.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
scaleX = scaleX -0.2f;
scaleY=scaleY-0.2f;
graphView.invalidate();
}
});

ibRotate=(ImageButton)findViewById(R.id.rotate);
ibRotate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
angle=angle+20;
graphView.invalidate();
}
});

// ibGray=(ImageButton)findViewById(R.id.ibDarker);
ibBright=(ImageButton)findViewById(R.id.ibFlush);
ibDar=(ImageButton)findViewById(R.id.ibBlur);
ibEmbos=(ImageButton)findViewById(R.id.ibEmbos);

ibBright.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
color=color+0.2f;
graphView.invalidate();
}
});

ibDar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
color=color-0.2f;
graphView.invalidate();
}
});

ibBlur.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//채도 배수로 쓰일 전역변수 satur: 1이 기본
//0~1이면 채도가 낮게 보이고, 1 이상이면 채도가 높게 보임
//0으로 하면 회색조 이미지
//클릭 시마다 1, 0을 번갈아 함
if (blur == false) blur=true;
else blur=false;
graphView.invalidate();
}
});

ibEmbos.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//채도 배수로 쓰일 전역변수 satur: 1이 기본
//0~1이면 채도가 낮게 보이고, 1 이상이면 채도가 높게 보임
//0으로 하면 회색조 이미지
//클릭 시마다 1, 0을 번갈아 함
if (embos == false) embos=true;
else embos=false;
graphView.invalidate();
}
});
}

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

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

//화면()의 중앙 구하고, 전역변수에 설정된 값으로 캔버스 축척 설정
int cenX=this.getWidth()/2;
int cenY=this.getHeight()/2;
canvas.scale(scaleX, scaleY, cenX, cenY);
canvas.rotate(angle, cenX, cenY);

Paint paint=new Paint();
//rgb 각 색상의 배율, 알파, 밝기
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);
//채도값 0일 때, 채도 0으로 해 회색영상(setSaturation)
//1일땐 실행 안함. 이때, setSaturation()메소드 실행시
//앞의 컬러 매트릭스 값이 무시된다.
if(blur==true) {
BlurMaskFilter bMask;
bMask=new BlurMaskFilter(30, BlurMaskFilter.Blur.NORMAL);
paint.setMaskFilter(bMask);
}
if(embos==true) {
EmbossMaskFilter eMask;
eMask=new EmbossMaskFilter(new float[] { 3, 3, 3}, 0.5f,
5, 10);
paint.setMaskFilter(eMask);
}
paint.setColorFilter(new ColorMatrixColorFilter(cm));

Bitmap picture= BitmapFactory.decodeResource(getResources(),
R.drawable.gukbab);
int picX=(this.getWidth()-picture.getWidth())/2;
int picY=(this.getWidth()-picture.getWidth())/2;

//본래의 darwBitmap의 마지막 패러미터를 null paint로 변경
canvas.drawBitmap(picture, picX, picY, paint);

picture.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="wrap_content"
android:id="@+id/iconLayout"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="horizontal">
<!--레이아웃의 크기(높이) 1:9로 생성-->

<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibZoomin"
android:src="@drawable/tenmonan"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibZoomout"
android:src="@drawable/chiwawa"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibRotate"
android:src="@drawable/chinhan"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibFlush"
android:src="@drawable/naonda"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibDarker"
android:src="@drawable/naehan"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibBlur"
android:src="@drawable/gmw"/>

<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibEmbos"
android:src="@drawable/mamang"/>

</LinearLayout>

<LinearLayout
android:id="@+id/pictureLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="9"
android:gravity="center"
android:orientation="vertical">
</LinearLayout>

</LinearLayout>