2011-11-10 9 views
0

私はカスタムビューの使い方について少し混乱していると思います。私はスクエアからのエリック・バーク(今年のアンドディヴォンのスライド、ここではスライド:http://www.andevcon.com/AndevCon_II/downloadpresentation.aspx?aid=Taming_Android__User_Experience_Lessons_from_Square_pdf.zip&sid=2)からの講演のスライドに続きます。カスタムビューの使用方法(例: drawableを設定する

彼のコード、または少なくとも彼は、スライドで示した部分は、このような何かを行ってきました:私は何を得ることはありませんが、実際にこのビューを使用する方法である

public class EditablePhoto extends View { 

    private Bitmap framedPhoto; 
    private Bitmap image; 
    private Drawable placeholder; 

    public EditablePhoto(Context context) { 
     super(context); 
    } 

    @Override protected void onMeasure(int widthMeasureSpec, 
             int heightMeasureSpec) { 
     int measuredWidth = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
     int measuredHeight = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); 

     //ensure view always square 
     int min = Math.min(measuredHeight, measuredWidth); 
     setMeasuredDimension(min, min); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     if(placeholder == null && image==null) return; 

     if(framedPhoto == null) { 
      createFramedPhoto(Math.min(getWidth(), getHeight())); 
     } 

     canvas.drawBitmap(framedPhoto, 0, 0, null); 
    } 

    private void createFramedPhoto(int size) { 

     Drawable imageDrawable = (image!=null) 
       ? new BitmapDrawable(image) : placeholder; 

     Bitmap output = Bitmap.createBitmap(size, size, 
       Bitmap.Config.ARGB_8888); 

     Canvas canvas = new Canvas(output); 

     RectF outerRect = new RectF(0, 0, size, size); 
     float outerRadius = size/18f; 

     //Red rectangle 

     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.RED); 

     canvas.drawRoundRect(outerRect, outerRadius, outerRadius, paint); 

     paint.setXfermode(new PorterDuffXfermode(
       PorterDuff.Mode.SRC_IN)); 

     imageDrawable.setBounds(0, 0, size, size); 
     canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG); 
     imageDrawable.draw(canvas); 
     canvas.restore(); 
    } 
} 

今....どこで、いつこのクラスのプライベートフィールドであるビットマップを設定しますか?

一般的に混乱していて、いくつかの啓発が大好きです。

答えて

-1

OnDraw()を使用すると、キャンバス上のビューを描画します方法です。ここでもonDraw()を解析すると、CreateFramePhotoを呼び出すと、このBitmapをキャンバスに描画します。

は、XMLを介して)

1 XMLまたはJavaクラスでレイアウトのいずれかで

をこののCustomViewを追加することができます。

<EditablePhoto android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
       .......................... 
/> 

をコンストラクタEditablePhoto(コンテキストコンテキスト、属性セットの属性セットを追加するforgateいけない)のためにこの場合、Javaクラスを通じて

2):

EditablePhoto editablePhoto = new EditablePhoto(this); 
addView(editablePhoto) // or do anthing you want with this 
+0

お試しいただきありがとうございますが、これは本当に質問に答えません。あなたがしたことは、onDrawが一般的に行うことを説明することでした。実際にビットマップ/ドロウアブルを設定する方法には答えませんでした。 – LuxuryMode

+0

constuctorでビットマップを渡します。 EditablePhoto(コンテキストコンテキスト、属性セットの属性セット、ビットマップビットマップ)とクラス内にそれを保存し、それを使用するには、 –

+0

クエリ「私は何を得ることはありませんが、実際に今、このビューを使用する方法ですが....」間違った方法で私を指示しました。 –

0

1年以上が経過し、私は、これは正しい答えを探している人を助けることを願っています。私の場合は、このコード行をcreateFramedPhoto()メソッドの最後の部分として、

framedPhoto = output; 

としました。できます。 この例では、作者は丸みを帯びた矩形を背景として作成し、XORモードでビットマップを描くので、丸い四角形の外側にあるすべてのピクセルは切り捨てられます。

関連する問題