我试图在android中创建自己的视图,该视图只是一个椭圆形,将根据典型的android:layout_width和android:layout_height参数正确绘制.
因此,例如,如果在我的XML布局文件中,我有一个LinearLayout,它是最高级别的视图容器,那么我希望能够添加多个自己的椭圆形视图. (我称之为“ PieFiller”)
我知道我已经很接近了,但是由于某种原因,我不知道如何确定XML文件中的用户说的是“ fill_parent”还是“ wrap_content”,而且我也不知道我是否该要求该信息.让我们假设wrap_content会简单地绘制一个40×40像素的圆.但是,如果XML布局文件指定宽度应为“ fill_parent”,高度应为“ wrap_content”,则我需要一个长的水平椭圆形,其高度为40像素,并且屏幕上的像素数跨过.
以下是我的布局xml文件和自定义视图中的代码:
布局文件
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.example.relativelayoutexample"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:labelPosition="left"
custom:showText="true" />
android:layout_width="fill_parent"
android:layout_height="wrap_content"
custom:labelPosition="left"
custom:showText="true" />
自定义视图类称为“ PieFiller”
package com.example.relativelayoutexample;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class PieFiller extends View
{
private boolean mShowText;
private int mTextPos;
private Paint paint;
private RectF mBounds;
public PieFiller(Context context, AttributeSet attrs)
{
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PieFiller,0,0);
try
{
mShowText = a.getBoolean(R.styleable.PieFiller_showText, false);
mTextPos = a.getInteger(R.styleable.PieFiller_labelPosition, 0);
}
finally
{
a.recycle();
}
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);
mBounds = new RectF();
}
public void onDraw(Canvas canvas)
{
canvas.drawCircle(40.0f, 40.0f, 40.0f, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int minw = getSuggestedMinimumWidth();
int w = Math.max(minw,MeasureSpec.getSize(widthMeasureSpec));
int minh = this.getSuggestedMinimumHeight();
int h = Math.max(minh, MeasureSpec.getSize(heightMeasureSpec));
setMeasuredDimension(w,h);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
mBounds = new RectF(0,0,w,h);
}
public boolean ismShowText()
{
return mShowText;
}
public void setmShowText(boolean mShowText)
{
this.mShowText = mShowText;
this.invalidate();
this.requestLayout();
}
public int getmTextPos()
{
return mTextPos;
}
public void setmTextPos(int mTextPos)
{
this.mTextPos = mTextPos;
this.invalidate();
this.requestLayout();
}
}
顺便说一下,上面发布的代码结果,第一个PieFiller占据了整个屏幕. (我不想要)