2017-07-17 28 views
0

カスタムビューを作成していくつかの図形を描画しましたが、私の問題はビューに何も表示されていないことです。エラーメッセージもクラッシュもありません。マイカスタムクラスは次のようになります:カスタム描画ビューが表示されない

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

3番目のコンストラクタには 'init()'がありません –

+0

あなたは@MiguelIslaです。 3番目のコンストラクタにinit()を追加しましたが、同じ結果が得られます。 –

+0

MyDrawableとは – santalu

答えて

0

使用のI /コピーこの

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

私はそれを試してみましたが、私は同じ結果を持っています:( –

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.stackoverflow.DrawableView 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:layout_margin="12dp"/> 

</LinearLayout> 

:これはあなたのonDraw()実装であるため、

enter image description here

それは、私が唯一の青い四角形を参照してください理にかなって:

@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

私はこれを試してみましたが、同じ結果が得られます。 onDraw mDrawableObjにnull値があります。これが長方形だけを描画する理由です。これを引き起こす原因は何ですか? –

関連する問題