Surface拒绝显示canvas.draw ..图片?

时间:2014-11-27 16:27:47

标签: android surfaceview

我正在尝试将SurfaceView添加到我的主要活动的背景中,以绘制一些可以闲逛的时髦图像。 (主要用于屏幕保护程序,因为我们的屏幕始终在线)。我把它全部设置好并设置绘图线程并且它运行得很好......但是,SurfaceView拒绝绘制任何东西?!

根据this SO thread我设置了.setWillNotDraw(false);,但仍然没有变化!

然后我想也许这是我正在使用的图像,所以从应用程序中获得了一个完全随机的图像并尝试了,但仍然没有。所以然后我尝试绘制一个32x32黄色矩形......没有:(< / p>

非常感谢任何帮助,因为我显然遗漏了一些东西。

LogCat声明:

11-27 16:20:26.854    8801-8869/com.goosesys.gaggle I/FLOAT﹕ Drawing f=176/194
11-27 16:20:26.854    8801-8869/com.goosesys.gaggle I/FLOAT﹕ Drawing f=342/759
etc ... etc ...

以下是一些代码:

    protected void drawFloaters(Canvas canvas){
        canvas.drawColor(Color.BLACK, Mode.MULTIPLY);
        for(Floater f : mIcons) {
            canvas.drawBitmap(f.getImage(), f.getX(), f.getY(), null);
            canvas.drawRect(f.getX(), f.getY(), 32, 32, new Paint(Color.YELLOW));
            //canvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.icon_photo), 100, 100, null);
            Log.i("FLOAT", "Drawing f=" + f.getX() + "/" + f.getY());
        }
    }
}

class Floater {
    private int x = 0;
    private int y = 0;
    private Bitmap mImage;
    private Context mContext;

    public Floater(Bitmap img, Context c){
        mImage = img;
        this.x = getRandomX();
        this.y = getRandomY();
        mContext = c;
    }

    public Floater(Bitmap img, int x, int y, Context c){
        mImage = img;
        this.x = x;
        this.y = y;
        mContext = c;
    }

    public int getX() { return x; }
    public void setX(int x) { this.x = x; }
    public int getY() { return y; }
    public void setY(int y) { this.y = y; }
    public Bitmap getImage(){ return mImage; }

    private int getRandomX(){
        return new Random().nextInt(400);
    }

    private int getRandomY(){
        return new Random().nextInt(800);
    }
}

我的屏幕保护程序线程

public class ScreensaverThread extends Thread {
    private GaggleSurfaceView mSurface = null;
    private boolean mRunning = false;

    public ScreensaverThread(GaggleSurfaceView sv){
            mSurface = sv;
    }

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

    @Override
    public void run(){
        while(mRunning){
            Canvas canvas = mSurface.getHolder().lockCanvas();
            if(canvas != null){
                synchronized(mSurface.getHolder()){
                    mSurface.drawFloaters(canvas);
                }
                mSurface.getHolder().unlockCanvasAndPost(canvas);
            }
            try{
                sleep(30);
            }catch(InterruptedException ex){
                ex.printStackTrace();
            }
        }
    }
}

主要活动XML

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <view
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.goosesys.gaggle.screensaver.GaggleSurfaceView"
            android:id="@+id/view"
            android:background="@color/Black" />
    </FrameLayout>

    <TextView
        android:id="@+id/txtForShort"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/txtFriendlyName"
        android:layout_below="@+id/txtFriendlyName"
        android:text="@string/orinoco_for_short"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />

    <ImageView
        android:id="@+id/imgBubble"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:adjustViewBounds="true"
        android:maxHeight="128dp"
        android:maxWidth="128dp"
        android:src="@drawable/orinoco_bubble" />

    <TextView
        android:id="@+id/txtDesignatedId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtOrinocoHeader"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp"
        android:text="@string/orinoco_id_placeholder"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@color/Orange" />

    <TextView
        android:id="@+id/txtOr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtDesignatedId"
        android:layout_centerHorizontal="true"
        android:text="@string/orinoco_or"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/txtFriendlyName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtOr"
        android:layout_centerHorizontal="true"
        android:text="@string/orinoco_friendly_name_placeholder"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@color/Orange" />

    <TextView
        android:id="@+id/txtAssignedTo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtForShort"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="14dp"
        android:text="@string/orinoco_assigned_header"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="26sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/txtAssignedDriver"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtAssignedTo"
        android:layout_centerHorizontal="true"
        android:text="@string/orinoco_assigned_driver_placeholder"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@color/Orange"
        android:textSize="25sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/txtOrinocoHeader"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imgBubble"
        android:layout_centerHorizontal="true"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/orinoco_greeting"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold"
        android:typeface="normal" />

    <Button
        android:id="@+id/btnLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_login"
        android:textStyle="bold"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:id="@+id/btnTrainingMode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/orinoco_training_button"
        android:textColor="@color/green"
        android:textStyle="bold|italic"
        android:visibility="invisible"
        android:layout_above="@+id/btnLogin"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:id="@+id/txtVersion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imgBubble"
        android:layout_alignRight="@+id/txtAssignedTo"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

当您无法看到任何东西时,首先要尝试的是用一种明显的颜色(例如红色)填充整个表面。这样,如果表面的任何部分可见,您就会看到它。

对于SurfaceView,接下来要尝试的是通过从创建SurfaceView对象的点调用setZOrderOnTop(true),将曲面从一切后面移到一切前面。这样,如果您的绘图代码正在执行任何操作,您将在UI顶部看到表面。

要尝试的第三件事是摆脱android:background="@color/Black",这可能是你麻烦的根源。 SurfaceViews有两个部分,View和Surface。 Surface部分是一个独立的层,位于其他一切的后面; View部分应该是一个占位符,布局代码用它来提供一个透明的窗口&#34;在后面的表面,但你已经使它不透明,所以没有任何东西可以显示出来。