【问题标题】:Android- Matrix can not be modifiedAndroid-矩阵不能修改
【发布时间】:2014-07-26 00:27:21
【问题描述】:

我正在尝试为我的 SurfaceView 设置背景,但无法让它填满整个屏幕。我的drawable周围的右侧和底部都是黑色的,所以我想稍微缩放一下以适应每个屏幕。我发现的一个解决方案是使用矩阵来缩放我的位图。 我根据一些示例设置了我认为正确的内容,但它在打开之前就崩溃了,有关矩阵的错误无法修改。似乎无法弄清楚我可能做错了什么。

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;

public class MySurface extends SurfaceView implements Runnable {


SurfaceHolder ourHolder;
Thread ourThread = null;
boolean isRunning = true;

Bitmap Background;
Bitmap clouda;

Matrix matrix = new Matrix();


public MySurface(Context context) {
    super(context);
    init(context);

}

public MySurface(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public MySurface(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context context) {
    // do stuff that was in your original constructor...
    ourHolder = getHolder();
    ourThread = new Thread(this);
    ourThread.start();

    DisplayMetrics metrics = new DisplayMetrics();
    WindowManager windowManager = (WindowManager)     context.getSystemService(Context.WINDOW_SERVICE);
    windowManager.getDefaultDisplay().getMetrics(metrics);

    int screenHeight = metrics.heightPixels;
    int screenWidth = metrics.widthPixels;

    Background = BitmapFactory.decodeResource(getResources(), R.drawable.island);
    clouda = BitmapFactory.decodeResource(getResources(), R.drawable.clouda);


    Matrix matrix = getMatrix();

    RectF drawableRect = new RectF(0, 0, Background.getWidth(), Background.getHeight());
    RectF viewRect = new RectF(0, 0, screenWidth, screenHeight);
    Log.d("tag", drawableRect.toString());
    Log.d("tag", viewRect.toString());

    matrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);





}


@Override
public void run() {
    // TODO Auto-generated method stub
    while(isRunning){
        if (!ourHolder.getSurface().isValid())
            continue;


        Canvas canvas = ourHolder.lockCanvas(); 


        canvas.drawBitmap(Background, matrix, null);
        canvas.drawBitmap(clouda, 0, 0, null);

        ourHolder.unlockCanvasAndPost(canvas);

       }

   }



}

这是我的 logcat,我有两个标签,这样我就可以看到我正在绘制的高度和宽度:

07-26 00:25:23.649: D/dalvikvm(3966): GC_FOR_ALLOC freed 59K, 7% free 2562K/2736K, paused 2ms, total 3ms
07-26 00:25:23.681: D/dalvikvm(3966): GC_FOR_ALLOC freed 2K, 6% free 2900K/3076K, paused 3ms, total 4ms
07-26 00:25:23.693: I/dalvikvm-heap(3966): Grow heap (frag case) to 5.285MB for 2457612-byte allocation
07-26 00:25:23.697: D/dalvikvm(3966): GC_FOR_ALLOC freed <1K, 4% free 5300K/5480K, paused 3ms, total 3ms
07-26 00:25:23.709: D/dalvikvm(3966): GC_CONCURRENT freed <1K, 4% free 5300K/5480K, paused 7ms+0ms, total 9ms
07-26 00:25:23.745: D/tag(3966): RectF(0.0, 0.0, 640.0, 960.0)
07-26 00:25:23.749: D/tag(3966): RectF(0.0, 0.0, 768.0, 1184.0)
07-26 00:25:23.749: D/AndroidRuntime(3966): Shutting down VM
07-26 00:25:23.749: W/dalvikvm(3966): threadid=1: thread exiting with uncaught exception (group=0xa61b9908)
07-26 00:25:23.753: E/AndroidRuntime(3966): FATAL EXCEPTION: main
07-26 00:25:23.753: E/AndroidRuntime(3966): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hour24.by8by8/com.hour24.by8by8.MainActivity}: java.lang.IllegalStateException: Matrix can not be modified
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.os.Looper.loop(Looper.java:137)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at java.lang.reflect.Method.invokeNative(Native Method)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at java.lang.reflect.Method.invoke(Method.java:511)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at dalvik.system.NativeStart.main(Native Method)
07-26 00:25:23.753: E/AndroidRuntime(3966): Caused by: java.lang.IllegalStateException:  Matrix can not be modified
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.graphics.Matrix$1.oops(Matrix.java:43)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.graphics.Matrix$1.setRectToRect(Matrix.java:205)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at com.hour24.by8by8.MySurface.init(MySurface.java:69)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at com.hour24.by8by8.MySurface.<init>(MySurface.java:31)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at com.hour24.by8by8.MainActivity.onCreate(MainActivity.java:78)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.Activity.performCreate(Activity.java:5104)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-26 00:25:23.753: E/AndroidRuntime(3966):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-26 00:25:23.753: E/AndroidRuntime(3966):     ... 11 more

【问题讨论】:

  • MySurface.java 的第 69 行是什么?例外就在那里
  • 您是否考虑过改用Canvas#drawBitmap(Bitmap, Rect, Rect, Paint)
  • @joao2fast4u 那将是 69 上的 matrix.setRectToRect,我不确定您对 getMatrix() 的含义,因为这就是我的代码中的全部内容
  • getMatrix()SurfaceView 中的一个方法,显然这个返回的Matrix 是不能改变的。考虑使用我上一条评论中提到的drawBitmap() 重载。实现起来非常简单。将drawableRect 的类型更改为Rect,并为Paint 参数传递null。还有一个drawBitmap(Bitmap, Rect, RectF, Paint) 过载,所以viewRect 就可以了。
  • @MikeM。伙计..我花了几个小时试图理解矩阵、缩放位图以及任何可能连接的东西......所要做的就是添加两个矩形。非常感谢迈克的帮助。你是编程社区的一笔巨大财富。

标签: android matrix


【解决方案1】:

考虑改用Canvas#drawBitmap(Bitmap, Rect, RectF, Paint) 方法。你的代码大部分已经在那里了。将drawableRect 的类型更改为Rect,使其成为viewRect 类成员,并将null 传递给Paint 参数。

旁注:根据 Java 命名约定,Background 应该是 background

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多