【问题标题】:Matrix can not be modified矩阵不能修改
【发布时间】:2023-03-10 14:44:01
【问题描述】:

我正在使用http://www.inter-fuser.com/2010/01/android-coverflow-widget.html提供的代码实现封面流程

问题是,在这段代码中,ImageView 被用作封面流项目。我在我的应用程序中需要一个自定义 UI(LinearLayout 中的 ImageView 和 TextView),所以我创建了一个新适配器并在 CoverFlow.java 中将所有 ImageView 更改为 View,但这会导致应用程序崩溃并显示以下错误

03-31 18:32:36.486: E/AndroidRuntime(14839): FATAL EXCEPTION: main
03-31 18:32:36.486: E/AndroidRuntime(14839): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cisco.rnd.ytdeom/com.cisco.rnd.carousal.absspinner.CoverFlowAbsActivity}: java.lang.IllegalStateException: Matrix can not be modified
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.ActivityThread.access$700(ActivityThread.java:140)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.os.Looper.loop(Looper.java:137)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.ActivityThread.main(ActivityThread.java:4921)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at java.lang.reflect.Method.invokeNative(Native Method)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at java.lang.reflect.Method.invoke(Method.java:511)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at dalvik.system.NativeStart.main(Native Method)
03-31 18:32:36.486: E/AndroidRuntime(14839): Caused by: java.lang.IllegalStateException: Matrix can not be modified
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.graphics.Matrix$1.oops(Matrix.java:43)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.graphics.Matrix$1.preTranslate(Matrix.java:109)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.cisco.rnd.carousal.absspinner.CoverFlow.transformImageBitmap(CoverFlow.java:806)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.cisco.rnd.carousal.absspinner.CoverFlow.makeAndAddView(CoverFlow.java:861)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.cisco.rnd.carousal.absspinner.CoverFlow.layout(CoverFlow.java:668)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.cisco.rnd.carousal.absspinner.CoverAbsSpinner.setSelectionInt(CoverAbsSpinner.java:315)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.cisco.rnd.carousal.absspinner.CoverAbsSpinner.setSelection(CoverAbsSpinner.java:291)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at com.cisco.rnd.carousal.absspinner.CoverFlowAbsActivity.onCreate(CoverFlowAbsActivity.java:52)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.Activity.performCreate(Activity.java:5188)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
03-31 18:32:36.486: E/AndroidRuntime(14839):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
03-31 18:32:36.486: E/AndroidRuntime(14839):    ... 11 more

我的代码是

static private void transformImageBitmap(View imageView,int offset, 
         boolean initialLayout, int rotationAngle) {
    Camera camera = new Camera();
    Matrix imageMatrix;
    int imageHeight;
    int imageWidth;
    int bitMapHeight;
    int bitMapWidth;
    float scaleWidth;
    float scaleHeight;

    imageMatrix = imageView.getMatrix();

    camera.translate(0.0f, 0.0f, 100.0f);

    if (initialLayout) {
        if(offset < 0) {            
            camera.rotateY(rotationAngle);
        } else if (offset > 0) {
            camera.rotateY(-rotationAngle);
        } else {
            //Just zoom in a little for the central View
            camera.translate(0.0f, 0.0f, mMaxZoom);

        }
    } else {
        if (offset == 0) {
            //As the angle of the view gets less, zoom in
            int rotation = Math.abs(rotationAngle);
            if ( rotation < 30 ) {
                float zoomAmount = (float) (mMaxZoom +  (rotation * 1.5));
                camera.translate(0.0f, 0.0f, zoomAmount);                   
            } 
            camera.rotateY(rotationAngle);
        }
    }

    camera.getMatrix(imageMatrix);               

    imageHeight = imageView.getLayoutParams().height;
    imageWidth = imageView.getLayoutParams().width;
    bitMapHeight = imageView.getBackground().getIntrinsicHeight();
    bitMapWidth = imageView.getBackground().getIntrinsicWidth();
    scaleHeight = ((float) imageHeight) / bitMapHeight; 
    scaleWidth = ((float) imageWidth) / bitMapWidth; 

    imageMatrix.preTranslate(-(imageWidth/2), -(imageHeight/2));
    imageMatrix.preScale(scaleWidth, scaleHeight);  
    imageMatrix.postTranslate((imageWidth/2), (imageHeight/2));

}

请帮忙...

【问题讨论】:

    标签: android matrix coverflow


    【解决方案1】:

    提供的堆栈跟踪表明您无法触摸 imageMatrix,因此您应该创建现有矩阵的深层副本并在新矩阵上执行缩放和平移操作 将代码的最后三行替换为以下代码:

    Matrix newMatrix = new Matrix();
    newMatrix.set(imageMatrix);
    
    newMatrix.preTranslate(-(imageWidth/2), -(imageHeight/2));
    newMatrix.preScale(scaleWidth, scaleHeight);  
    newMatrix.postTranslate((imageWidth/2), (imageHeight/2));
    

    【讨论】:

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