自定义view(二)

来源:互联网 发布:计算机与网络 期刊 编辑:程序博客网 时间:2024/06/05 21:56

自定义view的最重要的一个部分是自定义它的外观。根据你的程序的需求,通过onDraw方法实现绘制。

创建绘图对象

在onDraw中,会传递给你一个Canvas。
canvas封装了绘制图形的方法。
还需要自定义一个 Paint去定义颜色样式的填充
简单来说:Canvas定义你在屏幕上画的图形,而Paint定义颜色,样式,字体。
view在重新绘制的时候会调用onDraw方法。尽量避免在onDraw初始化大量的Paint。这里将初始化放在构造方法中的init中进行。原因是onDraw方法会经常被调用。大量初始化会导致屏幕卡顿。
初始化Paint代码:
private void init() {
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(mTextColor);
if (mTextHeight == 0) {
mTextHeight = mTextPaint.getTextSize();
} else {
mTextPaint.setTextSize(mTextHeight);
}

mPiePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPiePaint.setStyle(Paint.Style.FILL);
mPiePaint.setTextSize(mTextHeight);

mShadowPaint = new Paint(0);
mShadowPaint.setColor(0xff101010);
mShadowPaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

处理布局

自定义view的布局可以通过两种方法
如果不是经常需要改变view的大小,可以重写的方法onSizeChanged()).
比如在你动态调整GridView的时候,就可以用到该方法。
如果你想更加精确的控制你的view的大小,需要重写onMeasure())方法。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Try for a width based on our minimum
int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();
int w = resolveSizeAndState(minw, widthMeasureSpec, 1);
// Whatever the width ends up being, ask for a height that would let the pie
// get as big as it can
int minh = MeasureSpec.getSize(w) - (int)mTextWidth + getPaddingBottom() + getPaddingTop();
int h = resolveSizeAndState(MeasureSpec.getSize(w) - (int)mTextWidth, heightMeasureSpec, 0);
setMeasuredDimension(w, h);
}

注意事项:

1.widthMeasureSpec和heightMeasureSpec有三种模式。需要根据不同的模式做相应的处理这里新建了个 resolveSizeAndState()用来处理不同模式view返回的大小。

2.计算view大小需要把padding考虑进去。

3.onMeasure()没有返回值。它通过调用setMeasuredDimension()来获取结果。重写onMeasure()方法必须被调用。

绘制

在onDraw中调用canvas对象中的方法绘制需要的形状。

1.绘制文字使用drawText()。指定字体通过调用setTypeface(), 通过setColor()来设置文字颜色.

2.绘制基本图形使用drawRect(), drawOval(), drawArc(). 通过setStyle()来指定形状是否需要filled, outlined.

3.绘制一些复杂的图形,使用Path类. 通过给Path对象添加直线与曲线, 然后使用drawPath()来绘制图形. 和基本图形一样,paths也可以通过setStyle来设置是outlined, filled, both.

4.通过创建LinearGradient对象来定义渐变。调用setShader()来使用LinearGradient。

5.通过使用drawBitmap来绘制图片.

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

// Draw the shadow
canvas.drawOval(
mShadowBounds,
mShadowPaint
);

// Draw the label text
canvas.drawText(mData.get(mCurrentItem).mLabel, mTextX, mTextY, mTextPaint);

// Draw the pie slices
for (int i = 0; i < mData.size(); ++i) {
Item it = mData.get(i);
mPiePaint.setShader(it.mShader);
canvas.drawArc(mBounds,
360 - it.mEndAngle,
it.mEndAngle - it.mStartAngle,
true, mPiePaint);
}

// Draw the pointer
canvas.drawLine(mTextX, mPointerY, mPointerX, mPointerY, mTextPaint);
canvas.drawCircle(mPointerX, mPointerY, mPointerSize, mTextPaint);

0 0