Surface 는 하드웨어 가속기능을 사용할 수 있도록 만들었다.
모든 뷰에 하드웨어 가속기를 사용하고 싶다면 mainfest 에서
android:hardwareAccelerated="true" 로설정하면된다.
method 중에는 hardwareAccelerated 안되는 경우가 있다.
Surface => 기본적으로 버블 퍼퍼링 을 해야 한다.
서피스는 -> 사진찍기할때 미리보기로 사용된다.
사진찍기로 미리보기는 실시간으로 빠르게 보여주기 위해
하드웨어 가속기술 필요하다. 일반 뷰는 3D 등에 사용 못하기 때문에
서피스를 사용한다.
"현재는 버전이 올라가서 뷰에서는 하드웨어 가속기술이 가능하다 "
= > 이것은 확인 해 봐야 한다.
Surface 메모리에 만들어지거나 상태가 바뀌거나
삭제되는것을 직접 관리할 수 있다.
class MainActivity
package org.androidtown.mysurface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
MySurfaceView mySurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySurfaceView=(MySurfaceView)findViewById(R.id.view1);
}
public void onButton1Clicked(View v){
mySurfaceView.doDraw();
}
}
R.layout.activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="org.androidtown.mysurface.MainActivity">
<Button
android:text="그리기"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:onClick="onButton1Clicked"
/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/button">
<org.androidtown.mysurface.MySurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:id="@+id/view1"
/>
</LinearLayout>
</RelativeLayout>
class MySurfaceView
package org.androidtown.mysurface;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
/**
* Created by choi on 2017-04-11.
*/
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{
Context mContext;
SurfaceHolder holder;
Paint paint;
public MySurfaceView(Context context) {
super(context);
init(context);
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context){
mContext=context;
this.holder=getHolder();
this.holder.addCallback(this);
paint =new Paint();
paint.setColor(Color.WHITE);
paint.setStrokeMiter(10.0f);
}
/* public void draw(){
//홀더 에서 캔버스객체를 가져온다.
Canvas canvas =holder.lockCanvas();
//사각형을 그린다.
canvas.drawRect(100, 100, 200, 200, paint);
// 캔버스를 다 그리면 unlock 을 하면서 캔버스에 그려준다.
//아직 화면에 그려진 상태는 아니다.
holder.unlockCanvasAndPost(canvas);
//다시 그리기 호출
invalidate();
}*/
public void doDraw(){
// invalidate 호출시 onDraw 호출
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(100, 100, 200, 200, paint);
Toast.makeText(mContext, "onDraw가 호출되었습니다.", Toast.LENGTH_SHORT).show();
}
//서피스에서 메모리를 생성
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
//서피스에서 메모리가 변경 되었을 때 제어
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//서피스에서 메모리에서 삭제 될때 제어
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
androidManifest.xml
android:hardwareAccelerated="true">
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.androidtown.mysurface">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:hardwareAccelerated="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
75강
76강
댓글 ( 4)
댓글 남기기