对齐自定义视图时出现问题

时间:2012-05-15 09:44:11

标签: android android-layout android-widget android-view

我只是想从头开始实现一个customView,即扩展视图类并覆盖onDraw()方法。只是想尝试构建一个简单的视图,这个视图现在只是绘制一个圆圈。我在调整它时面临一些问题,我无法理解android如何计算视图维度。   只有视图,即setContentView(新的MyCustomView(this))工作正常...它占用整个空间并绘制圆。但是,如果我施加任何限制,即给予保证金,或者将其与中心对齐,则会使我的观点完全丢失,并且它没有任何吸引力。问题是视图被其父级修剪,但无法理解为什么它被剪裁。任何有关这方面的帮助将不胜感激。这是我的代码。

这是我的customView

    public class MyCustomView extends View {

    private Paint myPaint=null;
    private boolean useCenters;
    private float xCoordinate;
    private float yCoordinate;
    private float viewWidth;
    private float viewHeight;
    private int totalTime;
    private static float SWEEP_INC ;
    private RectF myRect;
    private boolean shouldInvalidate;
    private float mSweep;

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initPaintComponents();
    }

    public MyCustomView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyCustomView(Context context) {
        this(context,null);
    }

    private void initPaintComponents() {

        myPaint = new Paint();
        myPaint.setStyle(Paint.Style.STROKE);
        myPaint.setStrokeWidth(4);
        myPaint.setColor(0x880000FF);
        useCenters = false;
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        calculateCoordinates();
    }

    private void calculateCoordinates() {

        xCoordinate = getX();
        yCoordinate = getY();
        viewWidth = getWidth();
        viewHeight = getHeight();
        myRect = new RectF(xCoordinate+3, yCoordinate+3, xCoordinate+viewWidth-(viewWidth/10), yCoordinate+viewHeight-(viewHeight/10));
        Log.i("SAMPLEARC","xcoordinate: "+xCoordinate+" ycoordinate: "+yCoordinate+" view width:"+viewWidth+" view height:"+viewHeight+" measured width: "+getMeasuredWidth()+"measured height:"+getMeasuredHeight());
    }

    public int getTotalTime() {
        return totalTime;
    }

    public void setTotalTime(int totalTime) {
        this.totalTime = totalTime;
        SWEEP_INC = (float)6/totalTime;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawArc(myRect, 0, mSweep, useCenters, myPaint);

         mSweep += SWEEP_INC;
         if(mSweep > 280)
         {
             myPaint.setColor(0x888800FF);
         }

        invalidate();
    }
}

MyActivity:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        MyCustomView myView = (MyCustomView) findViewById(R.id.customimg);
        myView.setTotalTime(10);
    }

main.xml中

  RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
   com.example.anim.MyCustomView android:id="@+id/customimg"
  android:layout_width="100dp"
  android:layout_height="100dp"
  android:layout_centerInParent="true"

如果我删除了xml中的centerInParent,它就会被绘制出来。所以在onMeasure()中调用setMeasureDimentions()也没有任何影响。但是xcoodinate,ycoordinate,viewWidth和viewHeight似乎给出了正确的值。只需要理解为什么视图被剪裁以及android如何在运行时计算尺寸。在绘制这些customView时,如何考虑边距参数。任何帮助将不胜感激。

提前致谢

2 个答案:

答案 0 :(得分:0)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:lib="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

  <com.ind.Custom_Attribute.LibView  
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content"    
  android:text=""
  lib:xattr="Custom attribute APPLIED!"
  />

</LinearLayout>     

答案 1 :(得分:0)

<resources>
   <declare-styleable name="CustomAttrs">
    <attr name="xattr" format="string" />
</declare-styleable>
</resources>

in values / attrs.xml