自定义视图android,Android自定义视图大小

我试图在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占据了整个屏幕. (我不想要)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值