自定义视图显示在屏幕中央

时间:2012-05-03 10:15:37

标签: android

我写了一个自定义视图类。

我在Main Layout xml上实现了自定义视图。并使用以下代码

设置屏幕中心的参数
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
     android:background="@drawable/cs_background"
     android:id="@+id/layout"
     >

   <com.drawings.DrawingView
            android:id="@+id/drawingview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"  
            /> 

 </RelativeLayout>

在图形布局中,它在中心位置正确显示。但是当我在模拟器上执行时,它显示在左上角。

我尝试使用下面的代码以编程方式更改以实现布局。

RelativeLayout layout = new RelativeLayout(this);
        DrawingView  myView = new DrawingView(this);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        layout.addView(myView,params);
        setContentView(linearLayout);

但它仍然是左顶级核心的表现。

我的绘图视图类是,

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class DrawingView extends View
{
    Context context;
    private Path mPath; 
    private Bitmap backgound;
    private Paint mPaint;
    private float mX,mY;

    private static final float TOUCH_TOLERANCE =4;


    public DrawingView(Context c)
    {
        super(c);
        context         = c;
        init();
    }
    public DrawingView (Context c, AttributeSet as)
    {
        super(c,as);
        context         = c;
        init();
    }

    private void init() 
    {
        mPath       = new Path();
        mPaint      = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
        backgound   = BitmapFactory.decodeResource(context.getResources(), R.drawable.cs_one);
    }

    @Override
    protected void onDraw(Canvas canvas) 
    {
        canvas.drawBitmap(backgound, 0, 0, null);
        if(!mPath.isEmpty())
            canvas.drawPath(mPath, mPaint);

        invalidate();
    }

    private void touch_start(float x, float y) 
    {
        mPath.moveTo(x, y);

    }
    private void touch_move(float x, float y) 
    {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);

        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
        {
            mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            break;
        case MotionEvent.ACTION_UP:
//          touch_up();
            break;
        }
        invalidate();
        return true;

    }

}

有什么问题?以及如何在屏幕中心显示自定义视图。 ?

3 个答案:

答案 0 :(得分:5)

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    this.setMeasuredDimension(backgound.getWidth(), backgound.getHeight());
}

实现onMeasure(int,int)

答案 1 :(得分:0)

改变它

 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.FILL_PARENT);

答案 2 :(得分:0)

您应该在自定义View类中实现

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)


在其中,您应该计算自定义视图的高度和宽度。 如果您需要在父级布局中集中自定义视图 - 请确保:

  • 自定义视图高度!=父视图高度

和/或

  • 自定义视图宽度!=父视图宽度


例如:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        final int height = mCircleRadius * 2; //calculated
        final int width = getMeasuredWidth(); //parent width

        setMeasuredDimension(width, height);
    }


现在您可以使用next作为自定义视图:

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

enter image description here

P.S。您看到android:layout_centerHorizontal="true"没有效果。原因是在 onMeasure 中使用父级宽度,而不是计算精确宽度。