2012-06-02 125 views
1

我從ImageView的派生類:自定義視圖的OnDraw接收不同尺寸的畫布

public class TouchView extends ImageView 
{ 
    @Override 
    protected void onDraw(Canvas canvas) 
    ... 

的TouchView中在活動的onCreate創建一次,並用來自SVG文件的可繪製填充。

ImageView imageView = new TouchView(this); 
imageView.setScaleType(ImageView.ScaleType.MATRIX); 
FrameLayout f = (FrameLayout)findViewById(R.id.frame2); 
FrameLayout.LayoutParams l = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT); 
f.addView(imageView, l); 
... 
is = openFileInput(svgname); 
svg = SVGParser.getSVGFromInputStream(is); 
is.close(); 

Drawable d = svg.createPictureDrawable(); 
imageView.setImageDrawable(d); 

所有的環境始終保持不變。然而在onDraw方法中,我得到了事件之間不同大小的畫布。這是代碼:

protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    Log.v("DRAW", " w= " + canvas.getWidth() + " h=" + canvas.getHeight()); 
    ... 
} 

產生日誌用線,從正常1024 * 728(這是對藥片的正確視圖尺寸)到200 * 160,其中在畫布變化的寬度和高度的來回(奇怪在我的圖紙中引入錯誤的東西)。我很尷尬。

對於相同的視圖/ drawable,canvas應該總是具有相同的大小嗎?該文檔說getWidth和getHeight方法返回當前圖形的尺寸圖層,但是不清楚該圖層是什麼,爲「幕後」畫布創建了多少圖層以及如何控制此過程。

我很感激任何解釋如何獲得一致的繪圖行爲,特別是通過獲取在onDraw上繪製的視圖的實際大小。

目前我使用的是該視圖的getDrawingRect呼叫的workround,但我不知道這是一個正確的方法,因爲它似乎的onDrawcanvas參數應該是完全充足的繪製尺寸。

回答

0

我有同樣的問題,這裏是我得到了這是如何固定的,希望它可以幫助你

protected void onDraw(Canvas c) { 
    super.onDraw(c); 
    int w = getWidth(), h = getHeight(); 
    // resize 
Matrix resize = new Matrix(); 
resize.postScale((float)Math.min(w, h)/(float)mMarker.getWidth(), (float)Math.min(w, h)/(float)mMarker.getHeight()); 
imageScaled = Bitmap.createBitmap(mMarker, 0, 0, mMarker.getWidth(), mMarker.getHeight(), resize, false); 

c.drawBitmap(imageScaled, 0,0, paint); 

} 

凡mMarker自定義ImageView的構造函數定義。

... 
private Bitmap mMarker, imageScaled; 
Paint paint = new Paint(); 


//Java constructor 
public AvatarImageView(Context context) { 
    super(context); 
    init(); 
} 

//XML constructor 
public AvatarImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

private void init() { 
    // load the image only once 
    mMarker = BitmapFactory.decodeResource(getResources(), R.drawable.silhouette_48); 
    mMarker.setHasAlpha(true);paint.setColor(Color.WHITE); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(4); 

    //invalidate(); // don't know if I need this 
}