안드로이드 개발 질문/답변
(글 수 45,052)
SurfaceView를 이용하여 그래프를 그리려고 합니다.
그래서 일단 DoubleBufferTestActivity.java파일 에서 Thread를 하나 돌려 값을 카운트 하도록 하고
Myview.java(SurfaceView)로 값을 넘기려고 합니다.
일단 Surface로 값을 넘겨 그래프를 그려야 하는데 아래 코딩데로 하면 문제가 있고
Linked Queue를 사용할 경우 Thread 처리에 지연이 많이 생기는 듯 합니다.
일단 DoubleBufferTestActivity.java에서 Frame Layout을 사용하여 Myview.java를 현재 뿌려주고 있고요...
두번째 문제는 그림이 그려지기는 하는데 그래프가 막 깜빡거리는 군요..ㅠㅠ
도데체 무엇이 문제인지 .ㅠ.ㅠ.....
DoubleBufferTestActivity.java
package exam.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.FrameLayout;
public class DoubleBufferTestActivity extends Activity {
/** Called when the activity is first created. */
FrameLayout F1;
private MyView mv;
private NumTest mNumTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
F1=(FrameLayout)findViewById(R.id.FB);
mv=new MyView(F1.getContext());
F1.addView(mv);
mNumTest =new NumTest();
mNumTest.start();
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
mv.GraphViewerInitialize(F1.getWidth(),F1.getHeight());
mv.MAX_TimeLine=(float)F1.getWidth();
mv.MAX_Y_AXIS=(float)F1.getHeight();
}
//Event Handler
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what)
{
case 0:
int[] value = (int[]) msg.obj;
mv.testnum=value[0];
break;
}
}
};
private class NumTest extends Thread
{
int [] ResultArray= new int[1];
int cnt=0;
public NumTest()
{
}
public void run()
{
while(true)
{
ResultArray[0]=cnt;
cnt++;
if(cnt==1024) cnt=0;
Message msg = new Message();
msg.what=0;
msg.obj = ResultArray;
handler.sendMessage(msg);
try {
Thread.sleep(4);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Myview.java(SurfaceView)
package exam.test;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class MyView extends SurfaceView implements Callback {
Mythread mMythread;
Paint paint = new Paint();
//Value Data
public float Y_Dot_size=0;
public float REAL_Y_Axis=0;
public float BEFORE_Y_Axis=0;
public float MAX_Y_AXIS=0; //LATOUR Y_AXIS
public float REAL_TimeLine = 0;
public float BEFORE_TimeLine = 0;
public float MAX_TimeLine = 0; // LAYOUT X_AXIS
public int testnum=0;
// 그리기 관련 설정
public void GraphViewerInitialize(int SizeX,int SizeY)
{
Y_Dot_size=(float)SizeY/(float)1023;
}
public MyView(Context context)
{
super(context);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
mMythread = new Mythread(context, holder);
// TODO Auto-generated constructor stub
}
public void surfaceCreated(SurfaceHolder holder)
{
mMythread.start();
// TODO Auto-generated method stub
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder holder)
{
// TODO Auto-generated method stub
}
class Mythread extends Thread{
SurfaceHolder mHolder;
Canvas canvas = null;
public Mythread(Context context, SurfaceHolder holder)
{
mHolder = holder;
}
public void run()
{
while(true){
canvas = mHolder.lockCanvas();
if(REAL_TimeLine==0)canvas.drawColor(Color.WHITE);
REAL_Y_Axis = ((float)testnum)*Y_Dot_size;//축소화
REAL_Y_Axis=MAX_Y_AXIS-REAL_Y_Axis;//Y 반전
try
{
synchronized(mHolder)
{
canvas.drawLine((float)BEFORE_TimeLine,(float)BEFORE_Y_Axis,(float)REAL_TimeLine,(float)REAL_Y_Axis,paint);
}
}
finally
{
mHolder.unlockCanvasAndPost(canvas);
}
BEFORE_Y_Axis=REAL_Y_Axis;
BEFORE_TimeLine=REAL_TimeLine;
REAL_TimeLine=REAL_TimeLine+(float)1;
if(MAX_TimeLine<=REAL_TimeLine)
{
BEFORE_TimeLine=0;
REAL_TimeLine=0;
}
try {
Thread.sleep(4);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<FrameLayout
android:id="@+id/FB"
android:layout_width="312dp"
android:layout_height="wrap_content"
android:layout_weight="0.47" />
</LinearLayout>