안녕하세요~
제가 간단한 메모장과 그림판을 만들려고 하는데요
위 그림처럼 위에는 메모장 그리고 아래는 그림판을 넣을려고 합니다.
package ab.ab;
import android.app.Activity;
import android.os.Bundle;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
class MyView extends View {
Paint mpaint;
ArrayList<Vertex> arVertex;
public MyView(Context context) {
super(context);
arVertex = new ArrayList<Vertex>();
mpaint = new Paint();
mpaint.setColor(Color.BLACK);
mpaint.setStrokeWidth(5.0f);
mpaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawColor(Color.WHITE);
for(int i=0; i<arVertex.size(); i++){
if(arVertex.get(i).draw){
canvas.drawLine(arVertex.get(i-1).x,
arVertex.get(i-1).y,
arVertex.get(i).x,
arVertex.get(i).y,
mpaint);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
arVertex.add(new Vertex(event.getX(), event.getY(), false));
return true;
//break;
case MotionEvent.ACTION_MOVE:
arVertex.add(new Vertex(event.getX(), event.getY(), true));
invalidate();
return true;
}
return false;
}
public class Vertex {
float x;
float y;
boolean draw;
Vertex(float _x, float _y, boolean _d){
this.x = _x;
this.y = _y;
this.draw = _d;
}
}
}
public class AbActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
}
그림 그리는 소스는 구했는데 이게 view를 상속 받아서 setcontentview로 화면에 뿌리잖아요~
그러면 화면 전체에 canvas가 꽉 차게 되는데요..
저는 위 그림처럼 메모장 있구 그 밑에 캔버스를 넣고 싶은데 어떻게 해야 할까요?
그리고 메모장 내용과 그림을 저장할때는 어떤 식으로 저장 해야 하나요?
회사라서 업로드가 되지 않아 Code Highlighter 사용 안합니당....
양해 부탁드려요
public class AbActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
root.setLayoutParams(params);
MyView mv = new MyView(this);
LinearLayout.LayoutParams mvParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT, 1.0F);
mv.setLayoutParams(mvParams);
TextView tv = new TextView(this);
LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT, 1.0F);
tv.setLayoutParams(tvParams);
tv.setText("Android Test Project Test Test Test Test Test Test Test");
root.addView(tv);
root.addView(mv);
setContentView(root);
}
}
메모장 관련 내용에 대해서는 내부 DB를 사용하셔서 저장한다음에 불러오는 방법도 괜찮을거 같네요
사진 같은 경우에는 png형태로 저장하거나 윗분말대로 스크린샷으로 Bimap에 저장하여 불러오는 방법도 있구요
메모장 관련 예제 소스 혹은 스크린 캡처, 혹은 Bitmap으로 저장하는 방법들에 대해서 구글링 해보기실 바랍니다^^
도움이 되었길......
제가 했던거라서 이건 자신있게 답변할수있겠네요.
윗분말씀대로 setcontetview를 메모장 xml로 잡으시구요 그 xml에서 LinearLayout 하나 더만드셔야되요.
fingerprint 예제자체가 어떤 레이아웃이있는게 아니라 캔바스에 비트맵을 그리는것이기때문에
그 비트맵을 담을 레이아웃이 있어야하구요, 그리고 그 레이아웃 아이디를 설정하신뒤에 자바코드에서
LinearLayout linear = (LinearLayout)findViewById(R.id.내레이아웃아이디);
linear.addView(new MyView(this));
이렇게 view를 Add해주시면 됩니다. 그리고 혹시 갤러리에서 사진을 불러오는경우라면
큰사진을 불러올 경우에는 캔바스에있는 비트맵해상도와 안맞아서 화면이 잘려서 나오는 경우가있어요.
그럴때면
내사진 = BitmapFactory.decodeFile(사진URL주소스트링값);
Rect 내사각형;
내사각형 = new Rect(0,0,480,700)
내캔바스.drawBitmap(내사진, null, 내사각형, null);
이런식으로 Rect라는 사각형 틀을 이용하면 사각형 틀에 맞춰서 이미지가 줄여지거나 늘여져서 나와요.




그림 그리는 부분을 구현해놓은 View를 setContentView로 띄우시지 마시고
메모장이 있는 xml을 띄우시고요
그림이 들어갈 영역엔 Linear같은걸로 영역을 잡으신 후에 그곳에 add시키시면 될 듯 합니다.
메모장 내용과 그림을 저장할때는 뭐....
현재 보여지고 있는 화면을 캡쳐하는 방식에 대해 검색해 보시면 될 듯 합니다.