2012-04-11 8 views
0

wechselt ich ein Kind Blick habe und ich mag die Leinwand, die einen Kreis zu zeichnen, die „Pixel“ auf der negativen Seite der Achse Umandroid Cliprect mit negativen Werten nicht übergeordnete Ansicht rect

canvas.drawCircle(0, 0, 50f, paint); 

hat dazu benutze ich clipRect, das funktioniert einwandfrei und ich sehe den ganzen circle. Jedoch wenn ich requestLayout auf der übergeordneten Ansicht verwenden und ändert die x, y Postion des Kindes Ansicht die negativen SIDs des Kreises sind nicht bitte gezeigt mir raten, was

hier zu tun ist der Code:

package natan.android.TestCanvas; 

    import android.app.Activity; 
    import android.graphics.Canvas; 
    import android.graphics.Color; 
    import android.graphics.Paint; 
    import android.os.Bundle; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.RelativeLayout; 
    import android.widget.RelativeLayout.LayoutParams; 

    public class TestCanvasActivity extends Activity { 

     View childView; 
     RelativeLayout parentView; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      childView = new View(this) 
      { 

       @Override 
       protected void onDraw(Canvas canvas) { 
        canvas.clipRect(-50, -50, 50, 50,android.graphics.Region.Op.REPLACE); 
        Paint paint = new Paint(); 
        paint.setStyle(Paint.Style.FILL); 
        paint.setColor(Color.RED); 
        canvas.drawCircle(0, 0, 50f, paint); 
        super.onDraw(canvas); 
       } 

      }; 

      parentView = new RelativeLayout(this); 
      parentView.addView(childView); 
      LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams()); 
      layoutParms.leftMargin=150; 
      layoutParms.topMargin=150; 
      setContentView(parentView); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams()); 
      layoutParms.leftMargin=100; 
      layoutParms.topMargin=100; 
      parentView.requestLayout(); 
      return super.onTouchEvent(event); 
     } 


    } 

Antwort

0

ich denke, dachte ich ein soulation aus ich es hier nahm von

http://www.devdaily.com/java/jwarehouse/android/core/java/android/view/ViewGroup.java.shtml

diese Zeile von Kabeljau mit es das Problem behoben

parentView.setClipChildren(false); 

und

parentView.requestLayout(); 
    parentView.invalidate(); 

Hopes hilft dies jemand anderes und wenn jemand einen besseren Einblick auf dieses Problem hat fügen Sie es

hier ist der vollständige Code:

public class TestCanvasActivity extends Activity { 

     View childView; 
     RelativeLayout parentView; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      childView = new View(this) 
      { 

       @Override 
       protected void onDraw(Canvas canvas) { 
             Paint paint = new Paint(); 
        paint.setStyle(Paint.Style.FILL); 
        paint.setColor(Color.RED); 
        canvas.drawCircle(0, 0, 50f, paint); 
        super.onDraw(canvas); 
       } 

      }; 






      parentView = new RelativeLayout(this) 
      { 

       @Override 
       protected void onLayout(boolean changed, int l, int t, 
         int r, int b) { 
        // TODO Auto-generated method stub 
        super.onLayout(changed, l, t, r, b); 
       } 

      }; 
      parentView.setClipChildren(false); 

      parentView.addView(childView); 
      parentView.setClipChildren(false); 
      LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams()); 
      layoutParms.leftMargin=150; 
      layoutParms.topMargin=150; 

      setContentView(parentView); 

     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams()); 
      layoutParms.leftMargin=100; 
      layoutParms.topMargin=100; 

      parentView.requestLayout(); 
      parentView.invalidate(); 

      return super.onTouchEvent(event); 


     } 


    } 
Verwandte Themen