如何编写自定义View的set方法
How to write set methods of custom Views
我已经编写了 View
的子类,并且包含了一个设置字段的方法。字段的值影响View
的大小和View
的内容。
我必须在 set
方法中写什么才能确保视图正确更新并立即生效?我问是因为当我使用自己的自定义视图作为 ListView
项目布局的一部分时,我发现当我尝试使用 [=17] 的 convertView
参数来回收自己的视图时=]的getView
方法,有时候set
方法好像不行。
这是我正在尝试做的事情的人为示例。我才刚刚开始学习如何扩展 View
,所以这段代码可能还有其他问题。
public final class SpotsView extends View {
private final MyActivity activity;
private int numberOfSpots;
public SpotsView(MyActivity activity) {
super(activity);
this.activity = activity;
}
public void setNumberOfSpots(int numberOfSpots) {
this.numberOfSpots = numberOfSpots;
// What do I have to write here?? invalidate()? forceLayout()?
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Resources resources = activity.getResources();
setMeasuredDimension(
(int) (numberOfSpots * resources.getDimension(R.dimen.block_width)),
(int) resources.getDimension(R.dimen.spots_view_height)
);
}
@Override
protected void onDraw(Canvas canvas) {
int height = getHeight();
int width = getWidth();
float radius = activity.getResources().getDimension(R.dimen.network_outer_radius);
for (int i = 0; i < numberOfSpots; i++)
canvas.drawCircle((i + 0.5F) * (width / numberOfSpots), height * 0.5F, radius, activity.spotPaint());
}
}
看来你得打电话
invalidate();
requestLayout();
根据TextView#setCompoundDrawablePadding()的源代码,一种影响视图内容和大小的方法。
我已经编写了 View
的子类,并且包含了一个设置字段的方法。字段的值影响View
的大小和View
的内容。
我必须在 set
方法中写什么才能确保视图正确更新并立即生效?我问是因为当我使用自己的自定义视图作为 ListView
项目布局的一部分时,我发现当我尝试使用 [=17] 的 convertView
参数来回收自己的视图时=]的getView
方法,有时候set
方法好像不行。
这是我正在尝试做的事情的人为示例。我才刚刚开始学习如何扩展 View
,所以这段代码可能还有其他问题。
public final class SpotsView extends View {
private final MyActivity activity;
private int numberOfSpots;
public SpotsView(MyActivity activity) {
super(activity);
this.activity = activity;
}
public void setNumberOfSpots(int numberOfSpots) {
this.numberOfSpots = numberOfSpots;
// What do I have to write here?? invalidate()? forceLayout()?
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Resources resources = activity.getResources();
setMeasuredDimension(
(int) (numberOfSpots * resources.getDimension(R.dimen.block_width)),
(int) resources.getDimension(R.dimen.spots_view_height)
);
}
@Override
protected void onDraw(Canvas canvas) {
int height = getHeight();
int width = getWidth();
float radius = activity.getResources().getDimension(R.dimen.network_outer_radius);
for (int i = 0; i < numberOfSpots; i++)
canvas.drawCircle((i + 0.5F) * (width / numberOfSpots), height * 0.5F, radius, activity.spotPaint());
}
}
看来你得打电话
invalidate();
requestLayout();
根据TextView#setCompoundDrawablePadding()的源代码,一种影响视图内容和大小的方法。