0

ビュー内に一連の長方形を描画するカスタム ビューがあります。View を拡張し、onDraw メソッドをオーバーライドしました。

これはコンストラクタです(重要な部分だけを追加します)

 public CustomDrawableView(Context mContext , AttributeSet attr)
    {
        super(mContext,attr);

        //setMeasuredDimension(measuredWidth, measuredHeight)
        Log.e("CustomDrableView", "widht"+attr.getAttributeName(5));
        Log.e("CustomDrableView", "widht2"+attr.getAttributeValue(5));



        mColors = new int[] {
            //color codes
            };


        mColors_state_init = new int[]
                {
                    //color codes
                };

        mPaint = new Paint();
        mPaint.setAntiAlias(true);

        mPaint2 = new Paint(mPaint);
        mPaint2.setAlpha(64);

        float[] radii = {15,15,15,15,15,15,15,15};
        mDrawable = new ShapeDrawable(new RoundRectShape(radii, null, null));


       // mDrawable.getPaint().setColor(0xff74AC23);
        ShapeDrawable prev = mDrawable;
        mDrawables = new ShapeDrawable[15];

        for (int i = 0; i < 15; i++) {
            mDrawables[i] = new ShapeDrawable(new RoundRectShape(radii, null, null));
        }
}

これはonDrawです

protected void onDraw(Canvas canvas) {       
     mDrawable.setBounds(x, y, x + width, y + height);
      for (int i = 0; i < 15; i++) {

        mDrawables[i].getPaint().setColor(0xff74AC23);
        mDrawables[i].setDither(true);
        mDrawables[i].setBounds(x, y + (i *20), x+width, y+height+(i*20));
      }


    for(int i = 0 ; i < 15 ; i++)
    {
         ColorFilter filter = null;

         if (mColors[i] == 0) {
                    filter = null;
                } else {
                    filter = new PorterDuffColorFilter(mColors_test[i],
                            PorterDuff.Mode.SRC_ATOP);


        }


             mDrawables[i].setColorFilter(filter);
             mDrawables[i].draw(canvas);
    }

幅と高さの値は、画面サイズによって変更する必要があります。どうすればそれを達成できますか?

xml でビューの静的な幅と高さを指定しています。私はそれを避けるべきですか?

4

1 に答える 1

0

まず第一に、はい、xmlで静的な幅と高さを設定することは避け、それらをwrap_contentにする必要があります。そして、このようにする代わりに

 float[] radii = {15,15,15,15,15,15,15,15}; 

screenSizeに従って15に相当する値を見つけます。これを実現するには、画面サイズを取得する必要があります。screenSizesを取得したら、サイズを比例配分できます。これは次のようなものである可能性があります。

 int calculatedValue = screenWidth * 15 / 320;    // I assume 320 as a default screen width here
 float[] radii = {calculatedValue, calculatedValue, calculatedValue, calculatedValue, calculatedValue, calculatedValue, calculatedValue, calculatedValue}

そして、場合によっては、画面サイズを取得する方法がわからない場合は...ここにスニップがあります:

 public void GetDimensions() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    width = metrics.widthPixels;
    height = metrics.heightPixels;
}
于 2012-10-19T21:20:09.410 に答える