package exam.RelativeTest;
import java.util.ArrayList; import java.util.StringTokenizer; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.LinearLayout; import android.widget.TextView;
public class RelativeTestActivity extends Activity {
String[] textArray ={"aa bb ccc dddddd eeeeee fffffff\n" +
"gggggg hhhhhh iiiiiiiiii jjjjjjjjjjj kkkkkkkkkkk\n" +
"lllllllllllllll mm nn oooooooo\n" +
"ppppppppp qqqqqqqqq rrrrrrrrrrrr sssss\n" +
"ttttt uuuuu vvvvv\n" +
"ww xx yy\n" +
"zzzz aa bbbbbbbbbbbbbbbbb c ddddddddddddddddd eeeeeeeeeee\n" +
"fff gg hhhh iiiii jjjjjjjjjjj kkkkkkkkkkkk llllllllllll\n"
};
private StringTokenizer st;
private String splitText;
ArrayList<String> splitTextArr = new ArrayList<String>();
ArrayList<String> splitTextArr2 = new ArrayList<String>();
private String splitTextAll;
private StringTokenizer st2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
LinearLayout mainLayout = (LinearLayout)findViewById(R.id.ll);
// 한문장
st = new StringTokenizer(textArray[0] , "\n");
while (st.hasMoreTokens())
{
splitText = st.nextToken().trim();
splitTextArr.add(splitText);
LinearLayout listLayout = new LinearLayout(this);
mainLayout.addView(listLayout);
Log.e("문장",""+splitText);
//단어
st2 = new StringTokenizer(splitText , " ");
while (st2.hasMoreTokens())
{
splitTextAll = st2.nextToken().trim();
splitTextArr2.add(splitTextAll);
Log.e("단어",""+splitTextAll);
// final TextView tv = new TextView(this); //기본 텍스트 뷰
// tv.setText(splitTextAll); //set
StringView sv = new StringView(this,splitTextAll); // 커스텀뷰
listLayout.addView(sv); //add
}
Log.e("NEW-LINe","=================================================");
}
}
public class StringView extends View {private Paint textPaint; private String str2;
public StringView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public StringView(Context context , String str) {
super(context);
Log.e("",str);
str2 = str;
// TODO Auto-generated constructor stub
}
public void onDraw(Canvas canvas)
{
Log.e("onDraw",""+str2);
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(30f);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
textPaint.setColor(Color.RED);
canvas.drawText(str2, 0, 20, textPaint);
super.onDraw(canvas);
}
}
}
소스는 위와 같구요..
테스트 프로젝트 만드셔서.소스 붙여넣으셔도 아마 그냥 될거같은데요.
테스트용으로 간단하게 이너클래스로 적용했구요...
문제 요지는.while 문 안에..반복문임에도 불굼하고 . 커스텀뷰가 한번만 호출되고..
그 한번 또한 반복문 도는 중에는.호출되지 아니하고...반복문이 끝난시점..
즉. 소스상 로그보시면..Log.e( NEW LINE========== 이라고 되있는부분) 있을겁니다..- 이부분이 두번재 while 문이 끝난시점인데요
거기에서 한번만...젤 첫번째 데이터만 한번 호출하고.끝나네요...
반복문에서..커스텀뷰.원래 호출안되나요?ㅡㅡ;; 말이 이상하네.;;
아효.ㅠㅠ

젤아래 onDraw ..이 부분입니다
이렇게 한번만 타고 끝이나네요..ㅠㅠ~
onDraw() 가 사용되어지는 부분에서 해깔리시는거 같으신데,
올려주신 소스에서 onDraw() 안의 내용은 str2를 drawText하는것 뿐인데
당연히 그것만 하고 끝이죠.
onDraw() 무엇을 보여주려면 onDraw() 안에 그 내용을 넣어주셔야겠죠.
그리고 onDraw() 의 반복은 invalidate()를 이용하시면 됩니다
onDraw()안에서 invalidate()를 하면 안됩니다. onDraw()가 일어날때는 Canvas를 초기화하고 새로 그리는겁니다. 즉 어떤 움직이는 모습이 보여야 되는 커스텀뷰라면 마치 스케지북을 넘기듯 한장한장 다시 그린다고 생각하시면 됩니다.
예를 들겠습니다. 내가 터치해서 손가락을 움직일때 그림이 따라 움직여야 된다고 해보겠습니다. 그럼 그릴 수 있는 도구들을 커스텀뷰 생성자에서 준비합니다. 가령 Paint 등이 있고 최신 x, y좌표를 갱신할 수 있는 멤버변수등이 있을 수 있곘죠 그리고 onTouchEvent()를 오버라이드해서 터치 좌표를 받아 선언해둔 멤버변수 x, y에 넣습니다. 그리고 onTouchEvent 막바지에서 invalidate()를 호출하면 안드로이드 윈도우는 Canvas를 초기화한뒤 onDraw()로 던져 줍니다.
이제 만들어 두었던 Paint와 x, y좌표를 이용해서 canvas.drawBitmap을 이용해 그림을 터치 한 좌표에 그립니다. 이런 한 장면 장면이 모여서 마치 그림이 움직이는 듯한 커스텀뷰가 완성 되는겁니다.




ondraw가 왜 한번밖에 안하냐? 가 맞으십니까?