2011-12-05 6 views
7

Tôi có bố cục đơn giảnLàm thế nào để tạo SurfaceView với nền trong suốt?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/RelativeLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/backgroundtimer" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/TextView1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="@string/hello" /> 

    <com.fmech.zenclock.surface.ZenClockSurface 
     android:id="@+id/zenClockSurface1" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true"/> 

</RelativeLayout> 

Và một có ZenClockSurface lớp

package com.fmech.zenclock.surface; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.graphics.PixelFormat; 
import android.util.AttributeSet; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class ZenClockSurface extends SurfaceView implements SurfaceHolder.Callback{ 

    private DrawClock drawClock; 

    public ZenClockSurface(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
     getHolder().addCallback(this); 
    } 

    public ZenClockSurface(Context context) { 
     super(context); 
     this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
     getHolder().addCallback(this); 
    } 

    public ZenClockSurface(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
     getHolder().addCallback(this); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     //this.getHolder().setFormat(PixelFormat.TRANSPARENT); 
     drawClock = new DrawClock(getHolder(), getResources()); 
     drawClock.setRunning(true); 
     drawClock.start(); 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 
     // завершаем работу потока 
     drawClock.setRunning(false); 
     while (retry) { 
      try { 
       drawClock.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
      } 
     } 

    } 

    class DrawClock extends Thread{ 
     private boolean runFlag = false; 
     private SurfaceHolder surfaceHolder; 
     private Bitmap picture; 
     private Matrix matrix; 
     private long prevTime; 
     private Paint painter; 

     public DrawClock(SurfaceHolder surfaceHolder, Resources resources){ 
      this.surfaceHolder = surfaceHolder; 

      this.surfaceHolder.setFormat(PixelFormat.TRANSLUCENT); 
      picture = BitmapFactory.decodeResource(resources, R.drawable.ic_launcher); 

      matrix = new Matrix(); 
      this.painter=new Paint(); 
      this.painter.setStyle(Paint.Style.FILL); 

     } 

     public void setRunning(boolean run) { 
      runFlag = run; 
     } 

     @Override 
     public void run() { 
      Canvas canvas; 
      while (runFlag) { 

        matrix.preRotate(1.0f, picture.getWidth()/2, picture.getHeight()/2); 
       canvas = null; 
       try { 
        //surfaceHolder.getSurface().setAlpha(0.5f); 
        canvas = surfaceHolder.lockCanvas(null); 
        synchronized (surfaceHolder) { 

         canvas.drawColor(Color.TRANSPARENT); 

         canvas.drawBitmap(picture, matrix, this.painter); 
        } 
       } 
       finally { 
        if (canvas != null) { 
         surfaceHolder.unlockCanvasAndPost(canvas); 
        } 
       } 
      } 
     } 
    } 
} 

Và quy tắc hoạt động

package com.fmech.zenclock.surface; 

import android.app.Activity; 
import android.graphics.PixelFormat; 
import android.os.Bundle; 

public class ZenClockSurfaceActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     setContentView(R.layout.main); 


    } 
} 

Tôi muốn những gì màu nền của hình ảnh android là tranparent nhưng tôi nhận được màu đen lý lịch.

Tôi có nền tảng trên RelativeLayout với một số hình ảnh bu SurfaceView xoay biểu tượng Android không trong suốt.

Làm cách nào tôi có thể làm minh bạch?

+0

Tôi quên thêm this.getHolder(). SetFormat (PixelFormat.TRANSLUCENT); trong cả hai hàm tạo – Rasel

Trả lời

25

Yeah, tôi đã làm nó tôi giải quyết vấn đề

đang Hoạt động

package com.fmech.zenclock.surface; 

import android.app.Activity; 
import android.graphics.PixelFormat; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class ZenClockSurfaceActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ZenClockSurface sfvTrack = (ZenClockSurface)findViewById(R.id.zenClockSurface1); 
     sfvTrack.setZOrderOnTop(true); // necessary 
     SurfaceHolder sfhTrack = sfvTrack.getHolder(); 
     sfhTrack.setFormat(PixelFormat.TRANSLUCENT); 

    } 
} 

Surface Mã

package com.fmech.zenclock.surface; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.graphics.PixelFormat; 
import android.graphics.Region; 
import android.util.AttributeSet; 
import android.view.Surface.OutOfResourcesException; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class ZenClockSurface extends SurfaceView implements 
     SurfaceHolder.Callback { 

    private DrawClock drawClock; 

    public ZenClockSurface(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     getHolder().addCallback(this); 
    } 

    public ZenClockSurface(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
    } 

    public ZenClockSurface(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     getHolder().addCallback(this); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     drawClock = new DrawClock(getHolder(), getResources()); 
     drawClock.setRunning(true); 
     drawClock.start(); 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 
     drawClock.setRunning(false); 
     while (retry) { 
      try { 
       drawClock.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
      } 
     } 

    } 

    class DrawClock extends Thread { 
     private boolean runFlag = false; 
     private SurfaceHolder surfaceHolder; 
     private Bitmap picture; 
     private Matrix matrix; 
     private Paint painter; 

     public DrawClock(SurfaceHolder surfaceHolder, Resources resources) { 
      this.surfaceHolder = surfaceHolder; 

      picture = BitmapFactory.decodeResource(resources, 
        R.drawable.ic_launcher); 
      matrix = new Matrix(); 
      this.painter = new Paint(); 
      this.painter.setStyle(Paint.Style.FILL); 
      this.painter.setAntiAlias(true); 
      this.painter.setFilterBitmap(true); 
     } 

     public void setRunning(boolean run) { 
      runFlag = run; 
     } 

     @Override 
     public void run() { 
      Canvas canvas; 
      while (runFlag) { 


       matrix.preRotate(1.0f, picture.getWidth()/2, 
         picture.getHeight()/2); 
       canvas = null; 
       try { 
        canvas = surfaceHolder.lockCanvas(null); 
        synchronized (surfaceHolder) { 
         canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR); 
         canvas.drawBitmap(picture, matrix, this.painter); 
        } 
       } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        if (canvas != null) { 
         surfaceHolder.unlockCanvasAndPost(canvas); 
        } 
       } 
      } 
     } 
    } 
} 

Đó là công việc.

+1

drawColor (0, android.graphics.PorterDuff.Mode.CLEAR); cảm ơn bạn rất nhiều, tôi đã tìm kiếm điều này hàng giờ liền !! tôi nghĩ drawColor (Color.TRANSPARENT); sẽ hoạt động .... nhưng không, giải pháp của bạn đã cứu tôi ..! – tom91136

+0

Nó không hiệu quả với tôi. Tôi đã đặt nền của bố cục thành màu # f0f0f0, nhưng nền của chế độ xem bề mặt vẫn còn màu đen. – Genry

+0

@Dmitry Nelepov: Tôi đã thử cùng một mã. nhưng không làm việc cho tôi. Màu của surfaceview vẫn còn màu đen. – user2085965

3

Trong API 3 và 4, bạn không thể đặt bất kỳ thứ gì phía sau SurfaceView. Trích dẫn Dianne Hackborn:

Chế độ xem bề mặt thực sự là BEHIND cửa sổ của bạn và một lỗ được nhấn vào cửa sổ để bạn xem. Bạn do đó có thể đặt mọi thứ lên trên nó trong cửa sổ của bạn, nhưng không có gì trong cửa sổ của bạn có thể xuất hiện phía sau nó.

http://groups.google.com/group/android-developers/browse_thread/thread/8d88ef9bb22da574


Từ API 5 trở đi bạn có thể sử dụng setZOrderOnTop. Bí quyết là bạn phải làm điều đó trong constructor của bạn để nó được gọi trước khi xem được gắn vào cửa sổ:

public ZenClockSurface(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setZOrderOnTop(true); 

    SurfaceHolder holder = getHolder(); 
    holder.setFormat(PixelFormat.TRANSLUCENT); 
} 
+0

Tôi không sửa. Những thay đổi tiếp theo trong hoạt động làm cho SorfaceView trong suốt khoảng trống công cộng onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.main); ZenClockSurface sfvTrack = (ZenClockSurface) findViewById (R.id.zenClockSurface1); sfvTrack.setZOrderOnTop (true); // cần thiết SurfaceHolder sfhTrack = sfvTrack.getHolder(); sfhTrack.setFormat (PixelFormat.TRANSLUCENT); } –

+0

nhưng tôi vẫn gặp khó khăn, hiện tại nó quay - trang web có hình ảnh màu đen. –

+0

Cảm ơn bạn đã chỉ ra 'setZOrderOnTop', Rainwork! Tôi đã chỉnh sửa câu trả lời của mình. Hãy cho tôi biết nếu nó làm việc cho bạn. – chiuki