Android中关于背景图片的问题,求助。 2C

主程序中有俩个.java文件,分别如下。在layout中设置了android:background="@drawable/cc",然而被没有出现背景图片,还是黑兮兮的一片。求大牛帮助,不甚感激。
代码如下:
MainActivity.java

package com.example.homework;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {
public static MainActivity instance;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instance = this;
    //设置全屏
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //显示自定义的SurfaceView视图
    setContentView(new MySurfaceView(this));
}

}

MySurfaceView.java文件

package com.example.homework;

import android.app.Service;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

public class MySurfaceView extends SurfaceView implements Callback, Runnable {
private SurfaceHolder sfh;
private Paint paint;
private Thread th;
private boolean flag;
private Canvas canvas;
private int screenW, screenH;
//声明一个传感器管理器
private SensorManager sm;
//声明一个传感器
private Sensor sensor;
//声明一个传感器监听器
private SensorEventListener mySensorListener;
//圆形的X,Y坐标
private int arc_x, arc_y;
//传感器的xyz值
private float x = 0, y = 0, z = 0;

/**
 * SurfaceView初始化函数
 */
public MySurfaceView(Context context) {
    super(context);
    sfh = this.getHolder();
    sfh.addCallback(this);
    paint = new Paint();
    paint.setColor(Color.WHITE);
    paint.setAntiAlias(true);
    setFocusable(true);
    //获取传感器管理类实例
    sm = (SensorManager) MainActivity.instance.getSystemService(Service.SENSOR_SERVICE);
    //实例一个重力传感器实例  
    sensor = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);
    //实例传感器监听器
    mySensorListener = new SensorEventListener() {
        @Override
        //传感器获取值发生改变时在响应此函数  
        public void onSensorChanged(SensorEvent event) {
            x = event.values[0]; 
            //x>0 说明当前手机左翻 x<0右翻       
            y = event.values[1];
            //y>0 说明当前手机下翻 y<0上翻  
            z = event.values[2]; 
            //z>0 手机屏幕朝上 z<0 手机屏幕朝下  
            arc_x -= x;
            arc_y += y;
        }
        @Override
        //传感器的精度发生改变时响应此函数  
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
    //为传感器注册监听器
    sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);

}

/**
 * SurfaceView视图创建,响应此函数
 */
@Override
public void surfaceCreated(SurfaceHolder holder) {
    screenW = this.getWidth();
    screenH = this.getHeight();
    flag = true;
    //实例线程
    th = new Thread(this);
    //启动线程
    th.start();
}

/**
 * 游戏绘图
 */
public void myDraw() {
    try {
        canvas = sfh.lockCanvas();
        if (canvas != null) {
            canvas.drawColor(Color.BLACK);
            paint.setColor(Color.RED);
            canvas.drawArc(new RectF(arc_x, arc_y, arc_x + 50, arc_y + 50), 0, 360, true, paint);
            paint.setColor(Color.YELLOW);
            canvas.drawText("当前重力传感器的值:", arc_x - 50, arc_y - 30, paint);
            canvas.drawText("x=" + x+"    "+ "y=" + y +"    "+ "z=" + z, arc_x - 50, arc_y, paint);
            String temp_str = "温馨提示: ";
            String temp_str2 = "";
            String temp_str3 = "";
            if (x < 1 && x > -1 && y < 1 && y > -1) {
                temp_str2 += "当前手机处于水平放置的状态";
                if (z > 0) {
                    temp_str3 += "并且屏幕朝上"+"     "+"X轴的测试值:" + x + "                                              " + "Y轴的测试值:" + y + "                                                 "
                             + "Z轴的测试值:" + z;
                } else {
                    temp_str3 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~"+"     "+"X轴的测试值:" + x + "                                              " + "Y轴的测试值:" + y + "                                                 "
                             + "Z轴的测试值:" + z;
                }
            } else {
                if (x > 1) {
                    temp_str2 += "当前手机处于向左翻的状态"+"     ";
                } else if (x < -1) {
                    temp_str2 += "当前手机处于向右翻的状态"+"     ";
                }
                if (y > 1) {
                    temp_str2 += "当前手机处于向下翻的状态"+"     ";
                } else if (y < -1) {
                    temp_str2 += "当前手机处于向上翻的状态"+"     ";
                }
                if (z > 0) {
                    temp_str3 += "并且屏幕朝上"+"     "+"X轴的测试值:" + x + "                                              " + "Y轴的测试值:" + y + "                                                 "
                             + "Z轴的测试值:" + z;
                } else {
                    temp_str3 += "并且屏幕朝下,提示别躺着玩手机,对眼睛不好哟~"+"     "+"X轴的测试值:" + x + "                                              " + "Y轴的测试值:" + y + "                                                 "
                             + "Z轴的测试值:" + z;
                }
            }
            paint.setTextSize(10);
            canvas.drawText(temp_str, 0, 50, paint);
            canvas.drawText(temp_str2, 0, 80, paint);
            canvas.drawText(temp_str3, 0, 110, paint);
        }
    } catch (Exception e) {
        // TODO: handle exception
    } finally {
        if (canvas != null)
            sfh.unlockCanvasAndPost(canvas);
    }
}

/**
 * 触屏事件监听
 */
@Override
public boolean onTouchEvent(MotionEvent event) {
    return true;
}

/**
 * 按键事件监听
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return super.onKeyDown(keyCode, event);
}

/**
 * 游戏逻辑
 */
private void logic() {
}

@Override
public void run() {
    while (flag) {
        long start = System.currentTimeMillis();
        myDraw();
        logic();
        long end = System.currentTimeMillis();
        try {
            if (end - start < 50) {
                Thread.sleep(50 - (end - start));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
 * SurfaceView视图状态发生改变,响应此函数
 */
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

/**
 * SurfaceView视图消亡时,响应此函数
 */
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    flag = false;
}

}

以下是布局文件代码
<?xml version="1.0" encoding="utf-8"?>
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/cc"
>

4个回答

用 wrap_content 比 fill_parent 方便
你i看是不是 surfview fill_parnt

qq_25827845
温柔狠角色 楼下给出了解答。还是谢谢你。
大约 4 年之前 回复

1、你的渲染完全用的SurfaceView来作为视图容器,layout文件当然也就不起作用,因为setContentView(SurfaceView),跟你的布局就没关联了

qq_25827845
温柔狠角色 恩恩,这个懂了。那请问在SurfaceView中可以直接选用某个图片作为背景吗?还是必须得绘制背景?
大约 4 年之前 回复

//显示自定义的SurfaceView视图
setContentView(new MySurfaceView(this));

    你显示的自定义的,布局文件当然不显示啊。你需要在MySurfaceView里面增加背景!
qq_25827845
温柔狠角色 谢谢,那请问在SurfaceView中可以直接选用某个图片作为背景吗?还是必须得绘制背景?
大约 4 年之前 回复
//显示自定义的SurfaceView视图
setContentView(new MySurfaceView(this));

    这行代码是你直接把新建的一个MySurfaceView作为了Activity的背景,而你没有给这个MySurfaceView添加背景,你这里直接在布局文件里添加是没有用的,
    你可以这样写:
    MySurfaceView surfaceView = new MySurfaceView(this);
      surfaceView.setBackground(getActivity().getResources().getDrawable(R.drawable.cc));//这行可能不用getActivity()直接getResources()也行,你试一下
        setContentView(surfaceView);
        这样就没问题了

        或者你想自定义布局,就需要修改你自定义的MySurfaceView,如下:
        public MySurfaceView(Context context) {
        LayoutInflater.from(context.inflate(R.layout.mySurfaceViewLayout, this, true);//R.layout.mySurfaceViewLayout替换成你自己的布局文件就行了
        }
qq_25827845
温柔狠角色 回复oathchen: 你好,可否帮我实测一下。我的意思是要将cc这张图片作为背景,之后绘制的文本框等内容都在这张图片背景之上。按照上边提供的方法,还是会报错。求大牛帮忙验证,真心感谢。
大约 4 年之前 回复
u013017215
oathchen 回复温柔狠角色: 我不太清楚你要求的实现的具体情况,如果开始绘制东西的时候需要背景图片的话,把setBackground改成surfaceView.setBackground(getResources().getDrawable(R.drawable.cc).setAlpha(100));setAlphha是设置透明度的,数值为0-255,应该是这样的,你试一下,0为完全透明,255为完全不透明,这样就看得清楚一些。如果开始绘制以后不需要背景图片了,需要在绘图里面myDraw() 里写this.setBackground(Drawable.createFromPath(null));就行了
大约 4 年之前 回复
qq_25827845
温柔狠角色 改成这样surfaceView.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.cc));之后,出来的图片又会遮挡住自己绘制的东西。肿么破?求大神解答
大约 4 年之前 回复
qq_25827845
温柔狠角色 前辈你好,在getActivity()这里会报错。
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问