2011-12-05 19 views
7

Mam prosty układJak zrobić SurfaceView z przezroczystym tłem?

<?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> 

I mieć klasę ZenClockSurface

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); 
        } 
       } 
      } 
     } 
    } 
} 

i kod aktywności

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); 


    } 
} 

chcę co kolor tła android obraz był tranparent ale ja dostać czarny tło.

Mam tło na RelativeLayout z obrazkiem bu SurfaceView obracam ikonę Androida bez przezroczystości.

Jak mogę zrobić przezroczysty?

+0

Zapomniałem dodać this.getHolder(). SetFormat (PixelFormat.TRANSLUCENT), zarówno w konstruktorze – Rasel

Odpowiedz

25

Tak, zrobiłem to i rozwiązać problemu

kodu aktywny

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); 

    } 
} 

Kod Surface

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); 
        } 
       } 
      } 
     } 
    } 
} 

To działa.

+1

drawColor (0, android.graphics.PorterDuff.Mode.CLEAR); dziękuję bardzo, szukałem tego przez wiele godzin !! Myślałem, że drawColor (Color.TRANSPARENT); zadziała .... ale nie, twoje rozwiązanie uratowało mnie ..! – tom91136

+0

To nie działa dla mnie. Ustawiłem tło układu jako kolor # f0f0f0, ale tło widoku powierzchni nadal pozostało czarne. – Genry

+0

@Dmitry Nelepov: Próbowałem tego samego kodu. ale nie zadziałało dla mnie. Kolor widoku powierzchni wciąż pozostaje czarny. – user2085965

3

W interfejsie API 3 i 4 nie można umieścić niczego poza numerem SurfaceView. Cytując Dianne Hackborn:

Widok powierzchni faktycznie znajduje się za Twoim oknem, a dziurka w oknie, abyś mógł ją zobaczyć. W ten sposób możesz umieścić rzeczy na swoim miejscu w oknie, ale nic w twoim oknie nie może pojawić się za nim.

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


Od 5 roku API można użyć setZOrderOnTop. Sztuką jest to, że trzeba to zrobić w konstruktorze tak to jest wywoływana przed widok jest przymocowany do okna:

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

    setZOrderOnTop(true); 

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

nie mam racji. Kolejne zmiany w aktywności powodują, że przezroczysty interfejs SorfaceView jest przezroczysty public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.main); ZenClockSurface sfvTrack = (ZenClockSurface) findViewById (R.id.zenClockSurface1); sfvTrack.setZOrderOnTop (true); // niezbędne SurfaceHolder sfhTrack = sfvTrack.getHolder(); sfhTrack.setFormat (PixelFormat.TRANSLUCENT); } –

+0

ale nadal mam kłopoty, teraz to się kręci - strona, gdzie było zdjęcie jest czarne. –

+0

Dzięki za wskazanie 'setZOrderOnTop', Rainwork! Edytowałem swoją odpowiedź. Daj mi znać, czy to działa dla Ciebie. – chiuki

Powiązane problemy