21 일 학습 안 드 로 이 드 개발 강좌 의 Surface View

6442 단어 androidSurfaceView
지난 글 은MediaPlayer관련 내용 을 소 개 했 는데,이번 에는 두 편의 글 로 Surface View 의 용법 을 소개 한다.인터넷 에서 Surface View 를 소개 하 는 용법 은 매우 많 고 쓰기 도 층 이 다르다.예 를 들 어 Surface View 류 를 계승 하거나 Surface Holder.Callback 류 를 계승 하 는 등 기능 의 실제 수요 에 따라 스스로 선택 할 수 있다.저 는 일반 사용자 인터페이스 에서 Surface Holder 의 lockCanvas 와 unlockCanvas AndPost 를 직접 호출 할 것 입 니 다.
먼저 프로그램 이 실행 중인 캡 처 를 보십시오.
 
캡 처 1 은 주로 사인 파 를 Surface View 에 직접 그 리 는 모습 을 보 여 주 었 다. 

 
위의 좌우 두 그림 에 비해 오른쪽 그림 은.lockCanvas(null)를 사용 하고 왼쪽 그림 은.lockCanvas(new Rect(oldX,0,oldX+length,getWindowManager().getDefault Display().getHeight())를 사용 하여 두 가지 효 과 를 비교 해 보 세 요.왼쪽 그림 은 지 정 된 Rect 에 따라 그리 기 때문에 오른쪽 그림 의 전체 컨트롤 보다 효율 이 높 습 니 다.또한 화면 을 정리 한 후(canvas.draw Color(Color.Black)는 지난번 그림 의 잔 재 를 남기 지 않 습 니 다.
다음은 main.xml 의 원본 코드 를 붙 입 니 다.

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">

    <linearlayout android:id="@+id/LinearLayout01" 
        android:layout_width="wrap_content" android:layout_height="wrap_content">
        <button android:id="@+id/Button01" android:layout_width="wrap_content" 
            android:layout_height="wrap_content" android:text="    ">
        <button android:id="@+id/Button02" android:layout_width="wrap_content" 
            android:layout_height="wrap_content" android:text="     ">
    
    <surfaceview android:id="@+id/SurfaceView01" 
        android:layout_width="fill_parent" android:layout_height="fill_parent">

다음 프로그램 원본 코드 붙 이기:

package com.testSurfaceView;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class testSurfaceView extends Activity {
    /** Called when the activity is first created. */
    Button btnSimpleDraw, btnTimerDraw;
    SurfaceView sfv;
    SurfaceHolder sfh;

    private Timer mTimer;
    private MyTimerTask mTimerTask;
    int Y_axis[],//      Y    
    centerY,//   
    oldX,oldY,//   XY  
    currentX;//      X    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btnSimpleDraw = (Button) this.findViewById(R.id.Button01);
        btnTimerDraw = (Button) this.findViewById(R.id.Button02);
        btnSimpleDraw.setOnClickListener(new ClickEvent());
        btnTimerDraw.setOnClickListener(new ClickEvent());
        sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);
        sfh = sfv.getHolder();

        //           
        mTimer = new Timer();
        mTimerTask = new MyTimerTask();

        //    y   
        centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv
                .getTop()) / 2;
        Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];
        for (int i = 1; i < Y_axis.length; i++) {//      
            Y_axis[i - 1] = centerY
                    - (int) (100 * Math.sin(i * 2 * Math.PI / 180));
        }
    }

    class ClickEvent implements View.OnClickListener {

        @Override
        public void onClick(View v) {

            if (v == btnSimpleDraw) {
                SimpleDraw(Y_axis.length-1);//       
            
            } else if (v == btnTimerDraw) {
                oldY = centerY;
                mTimer.schedule(mTimerTask, 0, 5);//       
            }

        }

    }

    class MyTimerTask extends TimerTask {
        @Override
        public void run() {

            SimpleDraw(currentX);
            currentX++;//   
            if (currentX == Y_axis.length - 1) {//      ,     
                ClearDraw();
                currentX = 0;
                oldY = centerY;
            }
        }

    }
    
    /*
     *       
     */
    void SimpleDraw(int length) {
        if (length == 0)
            oldX = 0;
        Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length,
                getWindowManager().getDefaultDisplay().getHeight()));//   :    
        Log.i("Canvas:",
                String.valueOf(oldX) + "," + String.valueOf(oldX + length));

        Paint mPaint = new Paint();
        mPaint.setColor(Color.GREEN);//      
        mPaint.setStrokeWidth(2);//       

        int y;
        for (int i = oldX + 1; i < length; i++) {//      
            y = Y_axis[i - 1];
            canvas.drawLine(oldX, oldY, i, y, mPaint);
            oldX = i;
            oldY = y;
        }
        sfh.unlockCanvasAndPost(canvas);//     ,       
    }

    void ClearDraw() {
        Canvas canvas = sfh.lockCanvas(null);
        canvas.drawColor(Color.BLACK);//     
        sfh.unlockCanvasAndPost(canvas);

    }
}
이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기