2011-10-12 45 views
4

我的自定義視圖的OnDraw函數被無限調用並循環!什麼可能是可能的原因?Ondraw爲自定義視圖無限循環android

這是我的自定義視圖: -

public class Balls extends View{ 

    private static final String TAG = "BallsView"; 

    private int mMode = READY; 
    public static final int PAUSE = 0; 
    public static final int READY = 1; 
    public static final int RUNNING = 2; 
    public static final int LOSE = 3; 

    private final Paint mPaint = new Paint(); 
    private double mUx = 0.1; 
    private double mUy = 2; 
    private double mVy; 
    private double mVx; 
    private double mSx; 
    private double mSy; 
    private double mRange; 
    private float mX1; 
    private float mY1; 
    private int mX2; 
    private int mY2; 
    private int mDx; 
    private int mDy; 
    Time t; 
    float mAngle; 
    private final double mGravity = -9.8; 

    private long mLastTime; 

    private double mT; 

    private Canvas mCanvas = null; 



    public Balls(Context context, AttributeSet attrs, int defStyle){ 
     super(context, attrs, defStyle); 
     setFocusable(true); 
     setWillNotDraw(false); 
     mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     mPaint.setStrokeWidth(10); 
     mPaint.setAntiAlias(true); 
     mPaint.setStrokeCap(Cap.ROUND); 
     //mPaint.setColor(0xff00ffff); 
     mPaint.setARGB(255, 0, 255, 0); 

     mLastTime = System.currentTimeMillis(); 


    } 
    public Balls(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setFocusable(true); 
     setWillNotDraw(false); 
      mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
      mPaint.setStrokeWidth(10); 
      mPaint.setAntiAlias(true); 
      mPaint.setStrokeCap(Cap.ROUND); 
      mPaint.setColor(0xff00ffff); 

    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     Log.w(this.getClass().getName(),"onDraw of Balls called"); 
     super.onDraw(canvas); 
     mCanvas = canvas; 

     if(mCanvas!= null) 
      Log.w(this.getClass().getName(),"Canvas is not null"); 

    } 

此視圖在另一個活動如下膨脹: -

mBalls = (Balls) findViewById(R.id.balls); 

該視圖被放置在XML文件的相對視圖和相對內部視圖是水平滾動視圖的子視圖。

+0

沒有看到代碼我們不能幫你 – slayton

+0

@slayton,我已經添加了代碼! – Ruchira

回答

5

這裏沒有無限循環。發生的事情是操作系統正在儘可能快地重新繪製您的活動。當您的活動重新繪製時,它會重新繪製其所有子視圖。由於您的代碼的計算量非常小,從我在此處可以看到的情況來看,它的運行速度非常快,可能會以大於30 FPS的速率重繪。當日志消息不存在時,您的日誌消息會顯示爲有無限循環。實際上,您的onDraw方法中甚至沒有循環。

爲了說明正在進行的嘗試。一個受保護的成員drawCount添加到您的Balls類並將其設置爲0:

protect int drawCount = 0; 

然後追加drawCountonDraw日誌信息的末尾

public void onDraw(Canvas canvas){ 
     drawCount++; 
     Log.w(this.getClass().getName(),"onDraw of Balls called. Total draws:" + Integer.toString(drawCount)); 
    ... 
    } 

你應該看到的是每個日誌消息將顯示一個不同的drawCount。

如果你想花哨和計算你的應用程序的幀率,你可以測量自第一次抽獎以來的時間,然後將drawCount除以已經過去的時間,這會給你估計你的活動幀率。

+0

!感謝您的寶貴指導。 – Ruchira

3

onDraw()getate調用invalidate。 Invalidate()get在視圖或父級感覺需要更改並且必須更改其狀態時調用。

+0

你可以看看代碼嗎? – Ruchira

+0

我沒有看到任何問題。 onDraw()將被多次調用,這就是視圖的工作方式。你有什麼問題? – weakwire

+0

這是否意味着無限次調用ondraw是正常的? – Ruchira

0

onDraw(Canvas)過於頻繁地在無限循環中調用,是不正常的。 通常它應該被稱爲1到3次,如果沒有以下invalidate或佈局更改。 無限循環的原因可能是:
1,你叫invalidatepostInvalidate一些地方。
2,父母或兄弟姐妹的佈局一直在變化。
3,使用View.LAYER_TYPE_SOFTWARE,es。 setLayerType(View.LAYER_TYPE_SOFTWARE,null)。
值得注意的是,LAYER_TYPE_SOFTWARE將導致onDraw()被調用,就像循環中一樣。

相關問題