반응형
|
안드로이드(Android) 두개의 사용자정의 View 를 FrameLayout 으로 표현하기 |
|
환경 : Eclipse Mars, Android 4.2.2 |
이번에는 View 위젯을 상속받아 만든 사용자정의 View 2개를 FrameLayout 으로 메인화면에 표현해 봅니다. FrameLayout 의 사용법에 대해 간단히 알아볼 수 있는 샘플입니다.
▼ 이전에 작성했던 Bitmap 을 표현하는 View 와 사각형을 그리는 View 두개를 만들어 봅니다. 첫번째 View 는 터치 이벤트가 있을 때 Canvas 에 Paint 객체로 원을 그립니다.
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class FrameView1 extends View {
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
float cx = 0, cy = 0;
boolean draw = false;
public FrameView1(Context context) {
super(context);
init();
}
public FrameView1(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public FrameView1(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
paint.setColor(Color.BLUE);
setFocusable(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
MeasureSpec.getSize(heightMeasureSpec));
}
@Override
protected void onDraw(Canvas canvas) {
if (draw) {
canvas.drawCircle(cx, cy, 3, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
cx = event.getX();
cy = event.getY();
draw = true;
invalidate();
}else{
performClick();
}
return true;
}
@Override
public boolean performClick() {
return super.performClick();
}
}
▼ 두번째 View는 비트맵 이미지를 그립니다. Canvas 를 이용해 drawBitmap() 함수호출해서 그려 주면 됩니다.
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
public class FrameView2 extends View {
private Bitmap myBitmap;
public FrameView2(Context context) {
super(context);
}
public FrameView2(Context context, AttributeSet attrs) {
super(context, attrs);
myBitmap = BitmapFactory.decodeResource(
getResources(), R.drawable.view02);
}
public FrameView2(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
MeasureSpec.getSize(heightMeasureSpec));
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(myBitmap, 0, 0, null);
}
}
▼ 이렇게 두개의 FrameView1, FrameView2 클래스를 메인 레이아웃 xml 로 구성해서 한 화면에 표현이 가능합니다. Xml 요소를 구성할 때 View 클래스의 패키지 주소를 입력하면 위젯을 쓰는 것과 동일하게 적용이 가능합니다. 기능은 각 View 마다 독립적으로 구현이 가능하죠. 원을 그리는 View를 클릭해보시면 알수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.example.samplebooksearchapi.FrameView1
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<com.example.samplebooksearchapi.FrameView2
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
반응형
'안드로이드 개발' 카테고리의 다른 글
| 안드로이드(Android) SurfaceView 와 Thread 이용해 화면에서 움직이는 공구현 (0) | 2014.12.12 |
|---|---|
| 안드로이드(Android) SurfaceView 와 Thread 를 이용해여 사각형자동그리기 (0) | 2014.12.09 |
| 안드로이드(Android) getWidth() from the type Display is deprecated 수정 (0) | 2014.12.02 |
| 안드로이드(Android) SurfaceView 와 Thread 를 이용해 화면에 도형표현 하기 (0) | 2014.12.01 |
| 안드로이드(Android) onDraw() 를 이용해 스크린터치로 원그리기 (1) | 2014.11.29 |
| 안드로이드(Android) 경고 - Custom view… overrides onTouchEvent but not performClick (0) | 2014.11.28 |
| 안드로이드(Android) onDraw 함수를 이용해 화면에 비트맵이미지, 도형 그리기 (0) | 2014.11.27 |
| 안드로이드(Android) 코드경고 – Avoid object allocations during draw/layout operations (preallocate and reuse instead) 해제 하기 (0) | 2014.11.26 |
