히든 피겨스

Hidden Figures, 2016

장르 : 드라마



위아 유어 프렌즈

We Are Your Friends, 2015

장르 : 드라마, 멜로/로맨스



미 비포 유

Me Before You, 2016

장르 : 멜로/로맨스




출처 : https://developers-kr.googleblog.com/2017/04/update-your-app-to-take-advantage-of.html


최신폰의 화면비에서 테스트 하다보니 화면이 짤려나와서 아래 코드를 매니페스트에

추가하였습니다. 화면비가 달라질때마다 이런 코드들이 추가되어야 한다니 여러모로 귀찮은일이네요.


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

        <meta-data android:name="android.max_aspect" android:value="2.1" />
        
    </application>
</manifest>


날씨 : 더움

체중 : 69.6kg

후기 : 오랜만에 10km를 뛰어봄, 그늘을 뛸때에는 그나마 괜찮았지만, 땡볕에 뛸때에는 장난 아님, 

땀은 별로 안났지만 목이 급속도로 타들어가고

뛰는 내내 그늘만 골라서 달림. 그래서 더 힘들었던듯. 

다 뛰고 물 한 2리터 원샷한 듯



    


'달리기 흔적' 카테고리의 다른 글

[5km] 2017년 6월 18일 일요일  (0) 2017.06.18
[5km] 2017년 5월 25일  (1) 2017.05.25
[5km] 2017년 5월 23일  (0) 2017.05.23
[5km] 2017년 5월 16일  (0) 2017.05.16
[5km] 2017년 4월 27일 목요일  (0) 2017.04.27

앱 링크 URL

https://play.google.com/store/apps/details?id=com.poisonrose.doodle


  

 




간편한 조작으로 손가락으로 드로잉 하여 이미지를 만들 수 있습니다.


하단 부분 펜 터치하면 여러가지 모양으로 선택하여 그림을 그릴 수 있습니다.


펜 옆에 지우개 표시는 draw 되는 부분의 영역을 지울 수 있습니다.


펜 Size 를 자유롭게 조정할 수 있으며, 1~10까지 선택할 수 있습니다.


펜 color를 선택할 수 있습니다.


배경 color를 선택 할 수 있습니다.


상단 부분 돋보기 아이콘을 누르면 내가 드로잉 하여 저장한 이미지를 확인 할 수 있습니다.


상단 부분 그림 아이콘을 누르면 갤러리 내에서 이미지를 불러와 새로운 드로잉을 시작 할 수 있습니다.


드로잉 시작 후 상단 refresh 아이콘을 누르면 모든 작업을 취소하고 새로 시작 합니다.


공유 아이콘을 누르면 이미지를 저장 후 이미지 파일을 공유 할 수 있습니다.


+ 아이콘을 누르면 이미지를 저장합니다.


기타 오류사항이나 문의사항은 메일 주세요



날씨 : 바람 조금, 더움

체중 : 70.4kg

후기 : 뛰자마자 얼마 있지 않아 더워지기 시작했지만,

뛰는 내내 바람이 세게 불어줘서 땀은 별로 나지 않았음. 



     



'달리기 흔적' 카테고리의 다른 글

[5km] 2017년 6월 18일 일요일  (0) 2017.06.18
[10km] 2017년 5월 28일 일요일  (1) 2017.05.28
[5km] 2017년 5월 23일  (0) 2017.05.23
[5km] 2017년 5월 16일  (0) 2017.05.16
[5km] 2017년 4월 27일 목요일  (0) 2017.04.27

날씨 : 흐림 비올듯 말듯, 시원함

체중 : 70.1kg

후기 : 1km 부터 땀나기가 시작했지만, 바람이 많이 불어 금새 식어버림

맞바람일땐 숨쉬기가 힘들었음. 그래도 시원해서 그런지 조금 더 달림

샤워하기 전엔 69.9kg였는데 샤워하니 0.2kg 늘어남. 그래도 10년만에 60kg대 진입함



  






'달리기 흔적' 카테고리의 다른 글

[10km] 2017년 5월 28일 일요일  (1) 2017.05.28
[5km] 2017년 5월 25일  (1) 2017.05.25
[5km] 2017년 5월 16일  (0) 2017.05.16
[5km] 2017년 4월 27일 목요일  (0) 2017.04.27
[5km] 2017년 4월 25일 화요일  (0) 2017.04.25

android canvas 의 onDraw() 내에서

삼각형, 별, 하트 그리기 예제입니다.

Canvas 내 터치 영역에서 각 도형을 새로 그리는 예제도 TouchEvent 안에 적용되어 있습니다.


참고url

http://android-er.blogspot.kr/2014/05/draw-star-on-canvas.html


    


간단히 도형을 선택하는 버튼과 custom view가 정의 됩니다.

activity_main.xml

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

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bt_triangle"
        android:text="삼각형"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/bt_triangle"
        android:id="@+id/bt_star"
        android:text="별"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/bt_star"
        android:id="@+id/bt_heart"
        android:text="하트"/>

    <poisonrose.myapplication_canvas.MyView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:layout_below="@id/bt_triangle"
        android:id="@+id/my_view"/>

</RelativeLayout>



MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final MyView my_view = (MyView) findViewById(R.id.my_view);

        Button bt_triangle = (Button) findViewById(R.id.bt_triangle);
        bt_triangle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                my_view.drawTriangle();
            }
        });
        Button bt_star = (Button) findViewById(R.id.bt_star);
        bt_star.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                my_view.drawStar();
            }
        });
        Button bt_heart = (Button) findViewById(R.id.bt_heart);
        bt_heart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                my_view.drawHeart();
            }
        });
    }
}

MyView.java

생성자에서는 Paint 와 Path를 초기화 합니다.

실제 도형을 그리는 부분은 onDraw내의 canvas.drawPath() 에서 그리며,

포퍼먼스를 고려하여 항상, path의 reset(), close()를 잘 사용하여야 합니다.

코드내에서 보여지는 x, y 값이 선이 시작하는 부분이며,

TouchEvent에서는 현재 터치값을 불러와서 도형을 그리는 형태로 코드를 작성했습니다.

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {

    Paint m_Paint;
    Path m_Path;
    Canvas m_Canvas;

    enum Mode {
        TRIANGLE,
        STAR,
        HEART
    }

    private Mode mMode;

    private int mViewWidth = 0;
    private int mViewHeight = 0;

    public MyView(Context context) {
        super(context);
        initMyView();
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initMyView();
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initMyView();
    }

    public void initMyView(){
        m_Paint = new Paint();
        m_Paint.setAntiAlias(true);
        m_Paint.setDither(true);
        m_Paint.setColor(0xFFFF0000);
        m_Paint.setStyle(Paint.Style.STROKE);
        m_Paint.setStrokeJoin(Paint.Join.ROUND);
        m_Paint.setStrokeCap(Paint.Cap.ROUND);
        m_Paint.setStrokeWidth(4);

        m_Path = new Path();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mViewWidth = MeasureSpec.getSize(widthMeasureSpec);
        mViewHeight = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(mViewWidth, mViewHeight);
    }

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

        m_Canvas = canvas;
        m_Canvas.drawColor(0xFFFFFFFF);

        if(mMode == Mode.HEART) {
            float x = mViewWidth/2;
            float y = mViewHeight/2;
            m_Canvas.rotate(45,x,y);
        }
        // Path 갱신 영역
        m_Canvas.drawPath(m_Path, m_Paint);
    }

    public void drawTriangle() {
        float x = mViewWidth/2;
        float y = mViewHeight/2;
        drawTriangle(x, y);
    }

    public void drawTriangle(float x, float y) {
        mMode = Mode.TRIANGLE;
        int side = 200;  /** 삼각형 크기 */
        int height = 300;
        y = y - height;

        m_Path.reset();

        Point point1_draw = new Point((int)x, (int)y);        // 왼
        Point point2_draw = new Point((int)x-side, (int)y+height);  // 아래
        Point point3_draw = new Point((int)x+side, (int)y+height); // 오른
        m_Path.moveTo(point1_draw.x, point1_draw.y);
        m_Path.lineTo(point2_draw.x, point2_draw.y);
        m_Path.lineTo(point3_draw.x, point3_draw.y);
        m_Path.lineTo(point1_draw.x, point1_draw.y);

        m_Path.close();
        invalidate();
    }

    public void drawStar() {
        float x = mViewWidth/2;
        float y = mViewHeight/2;
        drawStar(x, y);
    }

    public void drawStar(float x, float y) {
        mMode = Mode.STAR;
        int radius = 200;   /** 별 크기 */
        y = y - radius;

        int numOfPt = 5;
        double section = 2.0 * Math.PI/numOfPt;
        int innerRadius = (int) (radius / 2.5);
        m_Path.reset();
        m_Path.moveTo(
                (float)(x + radius * Math.cos(0)),
                (float)(y + radius * Math.sin(0)));
        m_Path.lineTo(
                (float)(x + innerRadius * Math.cos(0 + section/2.0)),
                (float)(y + innerRadius * Math.sin(0 + section/2.0)));
        for(int i=1; i < numOfPt; i++){
            m_Path.lineTo(
                    (float)(x + radius * Math.cos(section * i)),
                    (float)(y + radius * Math.sin(section * i)));
            m_Path.lineTo(
                    (float)(x + innerRadius * Math.cos(section * i + section/2.0)),
                    (float)(y + innerRadius * Math.sin(section * i + section/2.0)));
        }
        m_Path.close();
        invalidate();
    }

    public void drawHeart() {
        float x = mViewWidth/2;
        float y = mViewHeight/2;
        drawHeart(x, y);
    }

    public void drawHeart(float x, float y) {
        mMode = Mode.HEART;
        float length = 200; // 하트 크기

        m_Path.reset();

        m_Path.moveTo(x,y);
        m_Path.lineTo(x-length, y);
        m_Path.arcTo(new RectF(x-length-(length/2),y-length,x-(length/2),y),90,180);
        m_Path.arcTo(new RectF(x-length,y-length-(length/2),x,y-(length/2)),180,180);
        m_Path.lineTo(x,y);

        m_Path.close();
        invalidate();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDraw(x, y);
                break;

            case MotionEvent.ACTION_MOVE:
                touchDraw(x, y);
                break;

            case MotionEvent.ACTION_UP:
                touchDraw(x, y);
                break;
        }
        return true;
    }

    private void touchDraw(float x, float y) {
        if(mMode == Mode.TRIANGLE) {
            drawTriangle(x, y);
        } else if(mMode == Mode.STAR) {
            drawStar(x, y);
        } else if(mMode == Mode.HEART) {
            drawHeart(x, y);
        }
    }
}


날씨 : 바람 조금, 시원한 날씨

미세먼지 : 적음

체중 : 70.8kg

후기 : 최근 미세 먼지 덕분에 달리질 못했더니, 몸이 뻐근함

반 이후 부터 땀나기 시작함, 달리기 좋은 날씨



      


'달리기 흔적' 카테고리의 다른 글

[5km] 2017년 5월 25일  (1) 2017.05.25
[5km] 2017년 5월 23일  (0) 2017.05.23
[5km] 2017년 4월 27일 목요일  (0) 2017.04.27
[5km] 2017년 4월 25일 화요일  (0) 2017.04.25
[5km] 2017년 4월 21일  (0) 2017.04.21

+ Recent posts