package com.android.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class testkk extends Activity implements View.OnClickListener{
testView test;
Button button;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
setContentView(layout);
test = new testView(this);
button = new Button(this);
layout.addView(test, new LinearLayout.LayoutParams(200,200));
layout.addView(button, new LinearLayout.LayoutParams(200,100));
button.setOnClickListener(this);
}
public class testView extends View
{
int value = 10;
Paint xx = new Paint();
public testView(Context context)
{
super(context);
}
public testView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public void onDraw(Canvas canvas){
xx.setColor(Color.RED);
canvas.drawLine(0,0,value,value,xx);
}
}
@Override
public void onClick(View v) {
while (test.value < 200)
{
Log.d("kk"," = "+ test.value);
test.value += 10;
test.invalidate();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
invalidate() 함수가 repaint() 와 같은 기능을 한다고 테스트 하고 있는데요.
일단 동작 하고 싶은 것은 0.1 초 마다 대각선으로 line 이 늘어나는 소스 인데요.
(처음과 최종 line 만 표시 되네요)
line 이 실시간으로 늘어나는 상황을 보고 싶은데 잘 안되는데 어디가 잘 못 된건가요?
Darklake 님 정말 감사 드려요. 해결 되었습니다.
혹시나 실례가 안된다면 왜 이렇게 해야 하는지 여쭤 봐도 되나요?
아둔한 제 지식을 깨우쳐 주시면 다시 한 번 감사 드리겠습니다. 부탁 드려요.
처음에 하셨던 방식을 살펴보시면 invalidate 를 하고 Thread.sleep 을 사용하셨는데
해당 sleep 은 activity 의 main thread 를 sleep 하도록 동작하는거죠.
그래서 while loop 를 도느라 invalidate 가 처리 되지 못하고 while 이 다 돌아버리는 거구요.
그래서 thread 를 하나 생성하여서 activity 의 main thread 가 선언한 객체가 invalidate 할 수 있도록 처리한겁니다.
invalidate 객체를 생성한 thread 에서만 사용할 수 있기 때문에 postInvalidate 를 사용했습니다.
while 문의 내용을 복사하셔서
thread 를 하나 만드시고 그 안에서 그리도록 해보세요.
아래처럼 하시면 됩니다.
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
while (test.value < 200)
{
Log.v("kk"," = "+ test.value);
test.value += 10;
test.postInvalidate();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}