점진적 과부하 개발 블로그

Android 13주차 Graphic 본문

Android/Java

Android 13주차 Graphic

지용빡 2022. 5. 30. 16:13
반응형
onDraw
  • onDraw
package com.induk;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class MyView extends View {

    public MyView(Context context) {
        super(context);
        setBackgroundColor(Color.BLUE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);
        paint.setStrokeWidth(20); // 외곽 두께
        paint.setTextSize(50);

        canvas.drawCircle(300, 500, 100, paint);
    }
}
  • multiLines
package com.induk;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;

public class MyView extends View {

    public MyView(Context context) {
        super(context);
        setBackgroundColor(Color.BLUE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);
        paint.setStrokeWidth(20); // 외곽 두께
        paint.setTextSize(50);

        float[] pts = {30, 120, 120, 220, 120, 220, 180, 50, 180, 50, 400, 400 };

        canvas.drawLines(pts, paint);
    }
}
  • xml 사용
package com.induk;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

public class MyView extends View {

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setBackgroundColor(Color.YELLOW);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(20);

        canvas.drawArc(new RectF(30, 50, 600, 600), 120, 270, true, paint);

    }
}
  • xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="5sp"
        android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#0000FF"
        android:text="컨텍스트 메뉴를 이용하여 도형그리기"/>

    <EditText
        android:id="@+id/edtCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:inputType="number"
        android:textColor="#FFFFFF"
        android:gravity="center"
        android:background="@drawable/border"
        android:layout_marginLeft="10sp"
        android:layout_marginRight="10sp"
        android:text="1"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text=""/>

</LinearLayout>

    <com.induk.MyView
        android:id="@+id/vCanvas"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5sp"/>

</LinearLayout>
컨텍스트 메뉴를 이용하여 도형 그리기
  • Main
package com.induk;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private MyView myView;
    private EditText edtCount;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myView = (MyView) findViewById(R.id.vCanvas);
        edtCount = (EditText) findViewById(R.id.edtCount);

    }

    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
                myView.setting(item.getItemId(), Integer.parseInt(edtCount.getText().toString()));
                myView.invalidate(); // ***
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
}
  • xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="5sp"
        android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#0000FF"
        android:text="컨텍스트 메뉴를 이용하여 도형그리기"/>

    <EditText
        android:id="@+id/edtCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:inputType="number"
        android:textColor="#FFFFFF"
        android:gravity="center"
        android:background="@drawable/border"
        android:layout_marginLeft="10sp"
        android:layout_marginRight="10sp"
        android:text="1"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text=""/>

</LinearLayout>

    <com.induk.MyView
        android:id="@+id/vCanvas"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5sp"/>

</LinearLayout>
  • border
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" android:thickness="0sp">
    <size android:width="30sp"/>
    <solid android:color="#0000ff"/>

</shape>
  • MyView
package com.induk;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.ContextMenu;
import android.view.View;

import androidx.annotation.Nullable;

public class MyView extends View {

    private int count;
    private int what;

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setBackgroundColor(Color.YELLOW);
        setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
            @Override
            public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
                contextMenu.setHeaderTitle("도형선택");
                contextMenu.add(0, 1, 0, "선");
                contextMenu.add(0, 2, 0, "면");
                contextMenu.add(0, 3, 0, "원");
                contextMenu.add(0, 4, 0, "타원");
                contextMenu.add(0, 5, 0, "부채꼴");
                contextMenu.add(0, 6, 0, "텍스트");
            }
        });
    }
    public void setting(int w, int c) {
        what = w;
        count = c;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        paint.setTextSize(100);
        paint.setStrokeWidth(20);

        switch(what) {
            case 1:
                for (int ii=0; ii < count; ii++) {
                    canvas.drawLine(100, 100 + (50 * ii), 600, 100 + (50 * ii), paint);
            }
                break;
            case 3:
                for (int ii=0; ii < count; ii++) {
                    canvas.drawCircle(300 + (150 * ii), 500, 100, paint);
                }
                break;
            default:
                break;
        }
    }
}
반응형

'Android > Java' 카테고리의 다른 글

Android Splash Screen 화면 구현  (0) 2022.06.05
Android Toast & Snackbar  (0) 2022.04.19