我正在尝试将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>
答案 0 :(得分:1)
当您无法看到任何东西时,首先要尝试的是用一种明显的颜色(例如红色)填充整个表面。这样,如果表面的任何部分可见,您就会看到它。
对于SurfaceView,接下来要尝试的是通过从创建SurfaceView对象的点调用setZOrderOnTop(true)
,将曲面从一切后面移到一切前面。这样,如果您的绘图代码正在执行任何操作,您将在UI顶部看到表面。
要尝试的第三件事是摆脱android:background="@color/Black"
,这可能是你麻烦的根源。 SurfaceViews有两个部分,View和Surface。 Surface部分是一个独立的层,位于其他一切的后面; View部分应该是一个占位符,布局代码用它来提供一个透明的窗口&#34;在后面的表面,但你已经使它不透明,所以没有任何东西可以显示出来。