简体   繁体   English

canvas.clipPath()在少数设备中不起作用

[英]canvas.clipPath() not working in few devices

I am facing problem with canvas.clipPath() in few devices. 我在少数设备中遇到canvas.clipPath()的问题。 Its working fine in emulator and some high end devices like MotoG and nexus tablet. 它可以在仿真器和某些高端设备(如MotoG和nexus平板电脑)中正常工作。 But when I tested in my friends cell phone the Square view which I am adding is not added and the application crashes giving the below error. 但是,当我在朋友手机中进行测试时,未添加要添加的Square视图,并且应用程序崩溃,出现以下错误。

I tried the soln of this question Android UnsupportedOperationException at Canvas.clipPath when I add the if statement as said in the ans of that question the square view is not added in my other devices as well (MotoG and nexus). 在Canvas.clipPath上尝试了Android UnsupportedOperationException这个问题的解决方案,就像该问题的答案中所述添加if语句时一样,方形视图也未添加到我的其他设备(MotoG和nexus)中。 So I cant use that soln in my case. 因此,我无法在自己的情况下使用该溶液。

However the square view is added in my friends cell phone if I just comment out canvas.clipPath(); 但是,如果我只是将canvas.clipPath();注释掉,正方形视图就会添加到我的朋友手机中。 but as expected few of my features are not working. 但不出所料,我的功能很少起作用。 How shall I solve this problem. 我该如何解决这个问题。 Please advice. 请指教。 Thanks in advance :) 提前致谢 :)

05-07 11:45:54.656: E/AndroidRuntime(5997): FATAL EXCEPTION: main
05-07 11:45:54.656: E/AndroidRuntime(5997): java.lang.UnsupportedOperationException
05-07 11:45:54.656: E/AndroidRuntime(5997): at  android.view.GLES20Canvas.clipPath(GLES20Canvas.java:429)
05-07 11:45:54.656: E/AndroidRuntime(5997): at example.Square.addText(Square.java:260)
05-07 11:45:54.656: E/AndroidRuntime(5997): at example.Square.onDraw(Square.java:140)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.draw(View.java:11054)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.getDisplayList(View.java:10493)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.drawChild(ViewGroup.java:2958)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2596)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.draw(View.java:11057)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.getDisplayList(View.java:10493)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.drawChild(ViewGroup.java:2958)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2596)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.draw(View.java:11057)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.getDisplayList(View.java:10493)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.drawChild(ViewGroup.java:2958)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2596)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.getDisplayList(View.java:10491)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.drawChild(ViewGroup.java:2958)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2596)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.getDisplayList(View.java:10491)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.drawChild(ViewGroup.java:2958)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2596)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.draw(View.java:11057)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.widget.FrameLayout.draw(FrameLayout.java:463)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2145)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.View.getDisplayList(View.java:10493)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:880)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewRootImpl.draw(ViewRootImpl.java:1911)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1635)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2455)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.os.Looper.loop(Looper.java:137)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
05-07 11:45:54.656: E/AndroidRuntime(5997):     at dalvik.system.NativeStart.main(Native Method)

I am getting error in this function of my square view class I am calling this function inside my onDraw method passing its canvas. 我在正方形视图类的此函数中遇到错误,正在通过其画布的onDraw方法中调用此函数。

private void addText(Canvas canvas){
    //setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    //Setting text

    canvas.clipPath(path);

    bitmapWidth = right+x+ mWidth;
    bitmapHeight = bottom+y+mHeight;

    if(bitmapWidth <= 10){
        bitmapWidth = 10;
    }
    if(bitmapHeight <= 10){
        bitmapHeight = 10;
    }

    bitMap1 = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);

    Canvas canvas1 = new Canvas(bitMap1);

    tp.setColor(textColor);
    txtWidth = (right+x+ mWidth)-(left+x);
    txtHeight = (bottom+y+mHeight)-(top+y);

    if(left+x < 0 ){
        txtWidth = (right+x+ mWidth);
    }
    if(top+y < 0){
        txtHeight = (bottom+y+mHeight);
    }
    pdl = new PlacableDynamicLayout(string,tp,txtWidth, txtHeight,Alignment.ALIGN_CENTER,1.0f,1.0f,false,Anchor.ANCHOR_TOP,1);
    pdl.draw(canvas1);

    canvas.drawBitmap(bitMap1, (left+x), (top+y) , paint);
}

Android has miserable (missing HW) fallback functionality. Android具有糟糕的(缺少硬件)后备功能。 Your exact situation will not work in emulator which has "Use host GPU" checked (at least in my 4.2.2. it is so). 您的确切情况在已选中“使用主机GPU”的模拟器中不起作用(至少在我的4.2.2中是如此)。 So the actual hardware will react in two ways (that I have seen): 因此,实际的硬件将以两种方式做出反应(我已经看到):

  1. throw an Exception (such as in your case) 引发异常(例如您的情况)
  2. Try to do the best it can (in my case Path bounding rect is calculated and applied as clipping rect instead of the Path) 尽力做到最好(在我的情况下,计算路径边界矩形,并将其作为剪切矩形而不是路径应用)

Software rendering will fix the issue as far as I have seen (but will probably be slower). 据我所知,软件渲染将解决此问题(但可能会更慢)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM