2014-05-07 3 views
0

Je rencontre un problème avec canvas.clipPath() dans quelques périphériques. Il fonctionne bien dans l'émulateur et certains appareils haut de gamme comme la tablette MotoG et Nexus. Mais quand j'ai testé dans mes amis téléphone portable la vue Square que j'ajoute n'est pas ajoutée et l'application se bloque en donnant l'erreur ci-dessous.canvas.clipPath() ne fonctionne pas dans quelques périphériques

J'ai essayé le soln de cette question Android UnsupportedOperationException at Canvas.clipPath lorsque j'ajoute l'instruction if comme indiqué dans les ans de cette question, la vue carrée n'est pas ajoutée dans mes autres appareils (MotoG et nexus). Donc je ne peux pas utiliser ce soln dans mon cas.

Cependant la vue carrée est ajoutée dans mon téléphone portable d'amis si je commente juste canvas.clipPath(); mais comme prévu, peu de mes fonctionnalités ne fonctionnent pas. Comment dois-je résoudre ce problème. Veuillez nous conseiller Merci d'avance :)

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) 

J'obtiens l'erreur dans cette fonction de ma vue sur la place de classe J'appelle cette fonction à l'intérieur de ma méthode onDraw passer sa toile.

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); 
} 
+0

Où est votre code? – GrIsHu

+0

@GrIsHu j'ai ajouté la fonction qui donnait l'erreur le canvas.clipPath donnait une erreur à l'intérieur de cette fonction – ik024

Répondre

3

Android dispose d'une fonctionnalité fallback (HW manquant). Votre situation exacte ne fonctionnera pas dans l'émulateur qui a "Use host GPU" coché (au moins dans mon 4.2.2, il en est ainsi). Ainsi, le matériel réel réagira de deux façons (que je l'ai vu):

  1. jeter une exception (comme dans votre cas)
  2. Essayez de faire le mieux possible (dans mon cas Chemin rect bondissant est calculé et appliqué comme rectangle d'écrêtage à la place du chemin)

Le rendu du logiciel résoudra le problème autant que je l'ai vu (mais sera probablement plus lent).

+0

je suppose que tu as raison. J'ai inclus le canvas.clipPath dans un try-catch pour le moment. Alors maintenant, son fonctionnement dans les appareils qui le supporte n les appareils qui ne supporte pas fonctionne sans clipPath (plus imp sans crash). Mais j'ai besoin de trouver un soln pour qu'il fonctionne dans tous les appareils bientôt. – ik024

+1

Rendu vers un bitmap. cela fonctionnera OK – velis

+0

Hey j'ai essayé de le rendre à un bitmap puis d'appeler canvas.drawBimap dans onDraw() et de passer mon bitmap. Cela semble fonctionner mais puisque je suis en train de mettre à jour mon carré sa hauteur et sa largeur etc etc sa trace de départ du dessin précédent. J'ai essayé ceci aussi canvas.drawColor (Color.TRANSPARENT, PorterDuff.Mode.CLEAR); mais toujours le dessin "outline" précédent est visible J'ai aussi essayé d'appeler reset() au path que j'utilise mais ça ne marche pas – ik024

Questions connexes