[android] Android, 캔버스 : surfaceView에있는 캔버스 (= 비트 맵)를 지우는 (내용을 삭제) 어떻게합니까?

간단한 게임을 만들기 위해 다음과 같은 비트 맵으로 캔버스를 그리는 템플릿을 사용했습니다.

private void doDraw(Canvas canvas) {
    for (int i=0;i<8;i++)
        for (int j=0;j<9;j++)
            for (int k=0;k<7;k++)   {
    canvas.drawBitmap(mBits[allBits[i][j][k]], i*50 -k*7, j*50 -k*7, null); } }

(캔버스는 “run ()”에 정의되어 있으며 SurfaceView는 GameThread에 있습니다.)

첫 번째 질문은 새 레이아웃을 위해 전체 캔버스를 지우거나 다시 그리는 방법입니다 .
둘째, 화면의 일부만 업데이트하려면 어떻게해야합니까?

// This is the routine that calls "doDraw":
public void run() {
    while (mRun) {
        Canvas c = null;
        try {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                if (mMode == STATE_RUNNING) 
                    updateGame();
                doDraw(c);          }
        } finally {
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);  }   }   }       }



답변

새 레이아웃을 위해 전체 캔버스를 지우거나 다시 그리려면 어떻게합니까 (= 게임에서 시도)?

을 호출 Canvas.drawColor(Color.BLACK)하거나 지우고 싶은 색상을 선택하세요 Canvas.

그리고 : 화면의 일부만 업데이트하려면 어떻게해야합니까?

Android OS는 화면을 업데이트 할 때 모든 픽셀을 다시 그리기 때문에 “화면의 일부”만 업데이트하는 방법은 없습니다. 그러나에서 이전 그림을 지우지 않을 때 Canvas이전 그림은 여전히 ​​표면에 남아 있으며 이는 아마도 화면의 “일부만 업데이트”하는 한 가지 방법 일 것입니다.

따라서 “화면의 일부를 업데이트”하려면 Canvas.drawColor()메서드 호출을 피하십시오 .


답변

PorterDuff 클리어 모드로 투명한 색상을 그립니다.

Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)


답변

Google 그룹에서 이걸 찾았고이게 저에게 효과적이었습니다 ..

Paint clearPaint = new Paint();
clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRect(0, 0, width, height, clearPaint); 

설정된 비트 맵을 유지하면서 도면 직사각형 등을 제거합니다.


답변

@mobistry의 답변을 시도했습니다.

canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);

그러나 그것은 나를 위해 일하지 않았습니다.

저에게 해결책은 다음과 같습니다.

canvas.drawColor(Color.TRANSPARENT, Mode.MULTIPLY);

아마도 어떤 사람은 같은 문제를 가지고있을 것입니다.


답변

경로 클래스의 재설정 방법 사용

Path.reset();


답변

mBitmap.eraseColor(Color.TRANSPARENT);

canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);


답변

surfaceview 확장 클래스 생성자에 코드 아래에 붙여 넣으십시오 ………….

생성자 코딩

    SurfaceHolder holder = getHolder();
    holder.addCallback(this);

    SurfaceView sur = (SurfaceView)findViewById(R.id.surfaceview);
    sur.setZOrderOnTop(true);    // necessary
    holder = sur.getHolder();
    holder.setFormat(PixelFormat.TRANSPARENT);

xml 코딩

    <com.welcome.panelview.PanelViewWelcomeScreen
        android:id="@+id/one"
        android:layout_width="600px"
        android:layout_height="312px"
        android:layout_gravity="center"
        android:layout_marginTop="10px"
        android:background="@drawable/welcome" />

위의 코드를 시도하십시오 …