2011-12-05 30 views
7

मैं सरल लेआउटपारदर्शी पृष्ठभूमि के साथ SurfaceView कैसे बनाएं?

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

और एक 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); 
        } 
       } 
      } 
     } 
    } 
} 

और गतिविधि के कोड है

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


    } 
} 

मैं चाहता हूँ कि क्या पृष्ठभूमि एंड्रॉयड तस्वीर का रंग tranparent था, लेकिन मैं काला मिलता है पृष्ठभूमि।

मेरे पास कुछ तस्वीरों के साथ रिलेवेटिवआउट पर पृष्ठभूमि है SurfaceView एंड्रॉइड आइकन को बिना पारदर्शी के घुमाएं।

मैं पारदर्शी कैसे कर सकता हूं?

+0

मैं इसे जोड़ना भूल गया .getHolder()। SetFormat (PixelFormat.TRANSLUCENT); दोनों कन्स्ट्रक्टर – Rasel

उत्तर

25

हाँ, मैं यह किया मैं

अभ्यास कोड

समस्या का समाधान
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); 

    } 
} 

भूतल कोड

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

यह काम है।

+1

drawColor (0, android.graphics।PorterDuff.Mode.CLEAR); बहुत बहुत धन्यवाद, मैं इसे घंटों के लिए देख रहा हूं !! मैंने ड्रॉकोलर (रंग। ट्रांसपेरेंट) सोचा; काम करेगा .... लेकिन ऐसा नहीं हुआ, आपके समाधान ने मुझे बचाया ..! – tom91136

+0

यह मेरे लिए काम नहीं किया। मैंने रंग # f0f0f0 होने के लिए लेआउट की पृष्ठभूमि सेट की है, लेकिन सतह दृश्य की पृष्ठभूमि अभी भी काला बनी हुई है। – Genry

+0

@Dmitry Nelepov: मैंने एक ही कोड की कोशिश की। लेकिन मेरे लिए काम नहीं किया। सतही दृश्य का रंग अभी भी काला बना हुआ है। – user2085965

3

एपीआई 3 और 4 में, आप SurfaceView के पीछे कुछ भी नहीं डाल सकते हैं। डियान हैकबर्न का उद्धरण:

सतह दृश्य वास्तव में आपकी खिड़की के पीछे है, और खिड़की में छेद वाला छेद आपको देखने के लिए है। इस प्रकार आप अपनी खिड़की में चीजों को इसके ऊपर रख सकते हैं, लेकिन आपकी खिड़की में कुछ भी इसके पीछे दिखाई नहीं दे सकता है।

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


एपीआई 5 के बाद से आप setZOrderOnTop उपयोग कर सकते हैं। चाल आप अपने निर्माता में यह करना है कि इससे पहले कि दृश्य खिड़की से जुड़ा हुआ है तो यह कहा जाता हो जाता है:

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

    setZOrderOnTop(true); 

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

में मैं सही नहीं हूं। गतिविधि में अगले बदलाव SorfaceView पारदर्शी सार्वजनिक शून्य पर क्रेट (बंडल सहेजा गया इंस्टेंसस्टेट) { super.onCreate (savedInstanceState); setContentView (R.layout.main); जेनक्लॉकसुरफेस sfvTrack = (ZenClockSurface) findViewById (R.id.zenClockSurface1); sfvTrack.setZOrderOnTop (सत्य); // आवश्यक SurfaceHolder sfhTrack = sfvTrack.getHolder(); sfhTrack.setFormat (PixelFormat.TRANSLUCENT); } –

+0

लेकिन मुझे अभी भी परेशानी है, अब यह बदल जाता है - साइट जहां तस्वीर काला थी। –

+0

'setZOrderOnTop', Rainwork को इंगित करने के लिए धन्यवाद! मैंने अपना जवाब संपादित कर लिया है। अगर यह आप के लिए काम करता है तो मुझे बतलाएगा। – chiuki

संबंधित मुद्दे