自定义绘制视图不显示

问题描述:

我创建了一个自定义视图来绘制一些形状,但我的问题是没有任何显示在视图上。我没有收到错误消息或崩溃。我的自定义类看起来类似:自定义绘制视图不显示

public class DrawableView extends View { 
    private Paint mPaint; 
    private MyDrawable mDrawableObj; // object to draw 
    private RectF mRectBounds; 

public DrawableView(Context context) { 
    super(context); 
    init(); 
} 

public DrawableView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public DrawableView(Context context, AttributeSet attrs, int defStyleAttr){ 
    super(context, attrs, defStyleAttr); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int w = MeasureSpec.getSize(widthMeasureSpec); 
    int h = MeasureSpec.getSize(heightMeasureSpec); 

    setMeasuredDimension(w, h); 
} 

public void setDrawableObj(MyDrawable obj, boolean forcePrepare) { 
    final boolean needPrepare = forcePrepare || (mDrawableObj != null) ; 
    mDrawableObj = obj; 
    mDrawableObj.setView(this); 
    if (needPrepare) { 
     prepareObject(); 
     invalidate(); 
    } 
} 

private void init() { 
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    mPaint.setColor(Color.BLUE); 
    mPaint.setStyle(Paint.Style.STROKE); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    final int padLeft = getPaddingLeft(); 
    final int padTop = getPaddingTop(); 
    final float xpad = (float) (padLeft + getPaddingRight()); 
    final float ypad = (float) (padTop + getPaddingBottom()); 

    final float ww = (float) w - xpad - 1; 
    final float hh = (float) h - ypad - 1; 

    mRectBounds = new RectF(0, 0, ww, hh); 
    mRectBounds.offsetTo(padLeft, padTop); 

    prepareObject(); 
} 

public void prepareObject() { 
    if (mDrawableObj != null) 
     mDrawableObj.prepare(mRectBounds); 
} 

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (mDrawableObj != null) 
     mDrawableObj.draw(canvas, mRectBounds); 
    else { 
     canvas.drawRect(mRectBounds, mPaint); 
    } 
} 

我的布局文件如下:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mainLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.hello.myApp.Draw"> 

<DrawableView.DrawableView 
    android:id="@+id/drawtest_drawableView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toBottomOf="@+id/toolbar" 
    app:layout_constraintLeft_toRightOf="@+id/leftMenu" 
    android:padding="4dp" /> 

</android.support.constraint.ConstraintLayout> 

你有任何想法,为什么我只有一个白色的屏幕?

+0

第三个构造函数没有'init()' –

+0

你是对的@MiguelIsla。我将init()添加到第三个构造函数,但得到了相同的结果。 –

+0

什么是MyDrawable? – santalu

使用本

public void init() { 
     if (isInEditMode()) 
       return; 
     //code 
     //... 
    } 
+0

我试过了,我有相同的结果:( –

我复制/粘贴你的代码我的IDE和运行它(虽然我不得不创建一个假MyDrawable接口,以满足编译器)。我只是将一个DrawableView的实例放入LinearLayout,我发现它画得很好。

我的布局XML:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/myLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <com.example.*.DrawableView 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:layout_margin="12dp"/> 

</LinearLayout> 

我看到:

enter image description here

这是有道理的,我只看到蓝色矩形,因为这是你onDraw()实现:

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (mDrawableObj != null) 
     mDrawableObj.draw(canvas, mRectBounds); 
    else { 
     canvas.drawRect(mRectBounds, mPaint); 
    } 
} 

鉴于setDrawableObj(MyDrawable obj, boolean forcePrepare)永远不会在您发布的代码中调用,else始终是执行/绘制的内容。

+0

我试过这个,我得到了相同的结果。在我的代码中我调用 setDrawableObj(MyDrawable obj,boolean forcePrepare)方法,它工作正常,但之后在onDraw mDrawableObj有一个空值,这就是为什么它只绘制一个矩形。你知道什么会导致这种情况吗? –