히든 피겨스

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


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

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


1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
    <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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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에서는 현재 터치값을 불러와서 도형을 그리는 형태로 코드를 작성했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
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