Android Graphics Example - Bitmap Image

Canvas 위에 도형 이외에 비트맵을 그려줘야 할때도 있다.
아래의 블로그 내용을 토대로 그려주자.

import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; import android.os.Bundle; import android.view.View; import android.view.Window; public class CanvasView extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(new ImageView(this)); } public class ImageView extends View{ private Bitmap image; // 이미지 public ImageView(Context context) { super(context); setBackgroundColor(Color.WHITE); // 그림 읽어들이기 Resources r = context.getResources(); image = BitmapFactory.decodeResource(r, R.drawable.excavator); } @Override protected void onDraw(Canvas canvas) { // 원본이미지 canvas.drawBitmap(image, 0, 0, null); // 원본이미지 영역을 축소해서 그리기 int w = image.getWidth(); int h = image.getHeight(); Rect src = new Rect(0, 0, w, h); Rect dst = new Rect(0, 200, w / 2, 200 + h / 2); canvas.drawBitmap(image, src, dst, null); super.onDraw(canvas); } } }

출처 : http://mainia.tistory.com/479

Android Graphics Example

커스텀뷰를 사용한 그리기 예제코드이다.
onDraw() 메서드와 캔버스객체를 이용하여 각 도형과 객체들을 생성하고 그리는 방법을 설명한다.

android-drawing-example
package com.vartist.drawdemo;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;

public class DrawDemo extends Activity {
   
    DemoView demoview;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        demoview = new DemoView(this);
        setContentView(demoview);
    }
   
    private class DemoView extends View{
        public DemoView(Context context){
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
           
            // 사용자 지정 그리기 코드
            // 기억하기:    y값은 하단을 기준으로 위를 향해 증가한다.
            //             x 는 좌측에서 우측으로 증가한다.
            int x = 0;
            int y = 0;
            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);

            // 전체 캔버스를 화이트로 입혀준다.
            paint.setColor(Color.WHITE);
            canvas.drawPaint(paint);
            // 다른 방법으로는 이렇게 한다:
            // canvas.drawColor(Color.WHITE);

            // 속이꽉찬 파란색 원을 그려보자.
            paint.setColor(Color.BLUE);
            canvas.drawCircle(20, 20, 15, paint);

            // 안티알리아싱 기능을 이용하여 파란색 원을 그려보자.
            paint.setAntiAlias(true);
            paint.setColor(Color.BLUE);
            canvas.drawCircle(60, 20, 15, paint);

            // 한번 그려진 원들을 비교해보자.
            // 첫번째 원은 톱니모양의 경계선이 존재한다.
            // 두번째 원은 부드러운 경계선이 존재한다.

            // 속이꽉찬 녹색 사각형을 그려보자.
            paint.setAntiAlias(false);
            paint.setColor(Color.GREEN);
            canvas.drawRect(100, 5, 200, 30, paint);

            // 삼각형을 생성하고 그려보자.
            // 세개의 라인세그먼트를 저장하기 위해 Path 객체를 사용하자.
            // 많은 위치에 그리기 위해 .offset을 사용하자.
            // 노트 : 이 사각형은 0, 0의 위치에 있지 않다.
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(2);
            paint.setColor(Color.RED);
            Path path = new Path();
            path.moveTo(0, -10);
            path.lineTo(5, 0);
            path.lineTo(-5, 0);
            path.close();
            path.offset(10, 40);
            canvas.drawPath(path, paint);
            path.offset(50, 100);
            canvas.drawPath(path, paint);
            // offset은 cumlative (?)하다.
            // 다음엔 이전위치에서 50, 100 옮겨진 위치에 그려보자.
            path.offset(50, 100);
            canvas.drawPath(path, paint);

            // STROKE 스타일을 이용하여 몇개의 텍스트를 그려보자.
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(1);
            paint.setColor(Color.MAGENTA);
            paint.setTextSize(30);
            canvas.drawText("Style.STROKE", 75, 75, paint);

            // FILL 스타일을 이용하여 몇개의 텍스트를 그려보자.
            paint.setStyle(Paint.Style.FILL);
            // 안티알리아싱을 켜보라.
            paint.setAntiAlias(true);
            paint.setTextSize(30);
            canvas.drawText("Style.FILL", 75, 110, paint);

            // 몇개의 회전된 텍스트를 그려보자.
            // 텍스트의 너비와 높이를 구하자.
            // 원하는 위치에 그려보자.
            x = 75;
            y = 185;
            paint.setColor(Color.GRAY);
            paint.setTextSize(25);
            String str2rotate = "Rotated!";

            // 회전된 텍스트를 그리기 앞서 결합된 사각형을 그려보자.
            Rect rect = new Rect();
            paint.getTextBounds(str2rotate, 0, str2rotate.length(), rect);
            canvas.translate(x, y);
            paint.setStyle(Paint.Style.FILL);
            // 회전하지 않은 텍스트를 그려보자.
            canvas.drawText("!Rotated", 0, 0, paint);
            paint.setStyle(Paint.Style.STROKE);
            canvas.drawRect(rect, paint);
           
            // x, y로의 위치이동을 취소하자.
            canvas.translate(-x, -y);

            // 그려질 텍스트의 중앙을 기준으로 캔버스를 회전하자.
            canvas.rotate(-45, x + rect.exactCenterX(), y + rect.exactCenterY());

            // 회전된 텍스트를 그려보자.
            paint.setStyle(Paint.Style.FILL);
            canvas.drawText(str2rotate, x, y, paint);

            // 회전을 취소하자.
            canvas.restore();
            canvas.drawText("After canvas.restore()", 50, 250, paint);

            // 점선막대를 그려보자.
            DashPathEffect dashPath = new DashPathEffect(new float[]{20,5}, 1);
            paint.setPathEffect(dashPath);
            paint.setStrokeWidth(8);
            canvas.drawLine(0, 300 , 320, 300, paint);
        }

    }
}
출처 : http://bestsiteinthemultiverse.com/2008/11/android-graphics-example/

[Android] Marquee effect in TextView

Marquee effect in TextView

TextView내 글자가 TextView 영역을 넘치는 경우, 흐르는 효과(marquee)을 줄수가 있는 다음과 같이 하면 된다.

1) 마퀴효과
TextView tv;
tv.setSingleLine(true);
tv.setEllipsize(TruncateAt.MARQUEE);  // 마퀴 효과주기
tv.setSelected(true); // 원래 포커스가 가야 마퀴가 동작하는데, 대신 선택시키면 동작함

2) ... 효과
TextView tv;
tv.setSingleLine(true);
tv.setEllipsize(TextUtils.TruncateAt.END);

출처 : http://cafe.naver.com/aphone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8044&

[Android] Apostrophe not preceded by \ 관련 String 에러 해결방법

error: Apostrophe not preceded by \

arrays.xml 등의 설정파일에 문자열을 입력하는 경우, 어퍼스트로피 (' ) 때문에 발생하는 오류이다.
문자열중의 특수문자 처리에 대한 오류인데, 아무래도 버그인듯 하다. 또는 특별한 이유가 있거나...

여하튼 처리방법은 아래와 같다.
기존 문자열이 <string name="my_menu_message_again">Don't see again</string> 라면...

문자열 앞뒤에 큰 따옴표를 붙여주면 해결된다.
<string name="my_menu_message_again">"Don't see again"</string>

top명령어와 사용방법

top이라고 친 후 h라고 입력 하면 도움말이 나옵니다. 거기에서 보고싶은 걸 입력하면 됩니다.
 
>#top
----------------------------------------------------------------------------
top - 11:35:19 up 44 days,  5:09,  5 users,  load average: 0.03, 0.05, 0.05
Tasks: 343 total,   1 running, 342 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.2% us,  0.1% sy,  0.0% ni, 96.7% id,  1.9% wa,  0.0% hi,  0.0% si
Mem:   2070100k total,  1748748k used,   321352k free,   233704k buffers
Swap:  2096472k total,      236k used,  2096236k free,   642728k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                              
 1629 webadmin  16   0  2808 1116  756 R    1  0.1   0:00.15 top
----------------------------------------------------------------------------
@각 행별 내용
1) 1행 : 시스템의 가동 시간과 평균 부하의 숫자를 출력
 
top - 11:35:19 up 44 days,  5:09,  5 users,  load average: 0.03, 0.05, 0.05
 
-> 현재시간(11:35:19 )과 uptime 값(up 44 day)를 알수 있으며, 현재 로그인 된 사용자의 수(5 users)와
    시스템의 최근 1분, 5분, 15분에 대한 각각의 평균 부하율(load average: 0.03, 0.05, 0.05)를 나타냄
->
 i.  Load average: 작업의 대기시간을 말한다. 값이 1이 나왔다면 1분 동안 평균 1개 정도의 프로세서가 대기상태에 있다는 것이다. 서버마다 차이가 있긴 하지만 5 정도면 서버가 부하를 받는 다고 생각한다. 과부하는 10 ~ 15이상이면 과부하라고 본다.
@ 시스템 평균 부하율 정보 : uptime
 
- 시스템의 평균 부하율을 확인할 수 있는 명령어
-1분, 5분, 15분간의 시스템 평균 부하율을 출력
-# uptime
 11:35:19 up 44 days,  5:09,  5 users,  load average: 0.03, 0.05, 0.05
-현재시간(11:35:19), 44일 동안 시스템 재부팅 없이 운영중임(up 44 day),  로그인한 시간(5:09), 현재 시스템에 접속한 사용자(5 users), 1분, 5분, 15분간의 시스템 평균 부하율(load average: 0.03, 0.05, 0.05) 정보를 출력
 
 
2) 2행 : 현재 실행중인 프로세스들의 상황
 
Tasks: 343 total,   1 running, 342 sleeping,   0 stopped,   0 zombie
 
-> 전체 실행된 현재 프로세스의 수는 (343 total), 실행중인 프로세스 ( 1 running), 유휴상태의 프로세스(342 sleeping),
정지 된 프로세스( 0 stopped), 좀비 프로세스(0 zombie)들의 상황을 알려줌
 
3) 3행 : CPU의 사용에 대한 상황 (이 정보를 통해 CPU의 사용현황을 파악하여 CPU의 추가적인 보강 계획이나
업그레이드 등의 계획을 세울수 있슴)
 
Cpu(s):  1.2% us,  0.1% sy,  0.0% ni, 96.7% id,  1.9% wa,  0.0% hi,  0.0% si
 
-> 사용자가 사용중인 CPU의 사용율(1.2% us), 시스템이 사용하는 CPU의 사용율(0.1% sy), NICE 정책에 의해 사용되는 CPU의 사용율( 0.0% ni), 사용되지 않는 CPU의 미사용율(96.7% id), 입출력 대기상태의 사용율(1.9% wa)등의 상황에 대해
알려줌
 
4) 4행 : 메모리의 사용에 대한 상황 (이 정보를 통해 메모리의 사용 현황에 대해 파악하고 메모리의 부족 현상 등을 분석하여 추가적인 메모리의 확장에 대해 고려할수 있슴)
 
Mem:   2070100k total,  1748748k used,   321352k free,   233704k buffers
 
-> 전체 물리적인 메모리(2070100k total), 사용중인 메모리(1748748k used), 사용되지 않는 여유 메모리(321352k free), 버퍼된 메모리의 ㅣ양(233704k buffers)등의 상황에 대해 알려줌
 
5) 마지막행 : 스왑메모리의 사용에 대한 상황(스왑 메모리의 사용이 증가할 경우에는 물리적 메모리의 확장을 고려)
 
Swap:  2096472k total,      236k used,  2096236k free,   642728k cached
 
-> 전체 스왑 메모리(2096472k total), 사용중인 스왑 메모리( 236k used), 남아있는 스왑메모리(2096236k free), 캐싱메모리(642728k cached)등의 상황에 대해 알려줌
 
 
@ 세부 정보 필드별 항목
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                
 
PID : 프로세스 ID (PID)
 
USER : 프로세스를 실행시킨 사용자 ID
 
PRI : 프로세스의 우선순위 (priority)
 
NI : NICE 값. 일의 nice value값이다. 마이너스를 가지는 nice value는 우선순위가 높다.
 
VIRT : 가상 메모리의 사용량(SWAP+RES)
 
SHR : 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합.
 
S : 프로세스의 상태 [ S(sleeping), R(running), W(swapped out process), Z(zombies) ]
 
%CPU : 프로세스가 사용하는 CPU의 사용율
 
%MEM : 프로세스가 사용하는 메모리의 사용율
 
COMMAND : 실행된 명령어
 
RES : 현재 페이지가 상주하고 있는 크기(Resident Size)
 
---------------------------------------------------------------------------------
 
A. CPU 과부하를 인지하는 것은 매우 어렵다.
    씨피유의 과부하는 실제로 메모리 문제들과 I/O 문제들 사이의 틈에 끼워져 있다. CPU과부하 여부를 확인하는 방법
    i. Uptime을 사용해 로드 평균값을 확인해 증가 하는지 혹은 감소 하는지 본다. 통상 시스템의 CPU개수에 2를 곱한 값을
       로드 평균의 적정 수준으로 보기 때문에 해당 시스템의 CPU개수에 따라 적절한 로드 평균값은 달라질 수 있다.
    ii. 디스크 접근이나 페이징을 위해 대기하고 있는 프로세스가 있나?
1. 그럼 프로세스가 있다면 I/O와 메모리 서브 시스템을 검사한다.
    iii. CPU의 대부분을 사용하고 있는 프로세스는 무엇인가?
1. CPU를 많이 사용하고 있는 프로세스들을 적절히 재배치 해 워크 로드를 보다 좋게 분산 시키도록 도와 준다.
    iv. 시스템 스테이트에서 CPU의 대부분 50% 이상의 시간을 소비 하고 있는가?
1. 그렇다면 I/O를 의심해 볼 필요가 있다. 소스 코드를 액세스 할 때 애플리케이션이 I/O를 효과적으로 사용하고 있는지 검사한다.
    v.  CPU로드가 높은데도 불구하고 IDLE 스테이트에서 CPU를 많이 10% 이상 사용하고 있는가?
1. 그렇다면 I/O나 메모리에 의심
    vi. CPU IDLE시간이 끊임 없이 0인가?
1. CPU가 활동량이 많은 것은 시스템을 잘 사용하고 있는 것이지만 항상 100% 사용하고 있다면 일은 어떤 곳에서 계속 쌓인다는 것이다. 즉, CPU 오버로드 발생하고 있다는 것이다.
B. 처방
     i. 불필요한 데몬 프로세스를 제거한다. Rwhod, routed는 성능에 문제를 주는 프로세스이다. Kill 한다.
     ii. at이나 다른 큐잉시스템을 이용해 사용자의 일을 야간에 수행하도록 한다. CPU(메모리, I/O 시스템)가 야간에는
        과부하가 걸린다고 하더라도 아침에 그 작업이 끝나면 보통 별 문제가 되지 않는다.
    iii. CPU에 의존적인 일의 우선순위를 낮추는데 nice를 사용함으로써 인터랙티브 퍼포먼스를 향상시킬 수 있다.
        여기서 CPU내에 의존적인 일의 우선순위를 높이는데 nice를 사용함으로써 그 일은 성능을 향상시키겠지만
        인터랙티브 퍼포먼스는 해치게 된다. Nice를 사용하는 것은 임시 방편적인 방법으로만 써야 한다. 만약 시스템의
        워크로드가 증가하게 된다면 이런 방법으로는 충분하지 않으며, 시스템을 업그레이드 하든지 교체 혹은 다름 시스템을
        구입해 로드를 공유, 분산해야 한다.

출처 : http://jace.tistory.com/96