在网上看到很多人都在问自定义View中,使用invalidate()方法并不会不调用onDraw(),其实很容易忽略的一个原因是:你调用invalidate()的对象是哪个?你使用你要刷新的那个View对象调用的invalidate()吗?我曾经就遇到过这样一个低级的错误。
代码如下:
//自定义View中有一个文本,对外提供接口动态改变文字。
public class ImgTextView extends View {
public ImgTextView(Context context) {
super(context);
}
public ImgTextView(Context context, AttributeSet attrs) {
super(context, attrs);
.....//代码省略
}
private void initPaint() {
paint = new Paint();
(true);
(color);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
(widthMeasureSpec, heightMeasureSpec);
....//自定义view的坐标测量操作
}
@Override
protected void onDraw(Canvas canvas) {
(canvas);
("ly","onDraw: "+titleMsg);
........//其它操作
//画出文本
(titleMsg, imgWidth, (imgHeight - textHei) / 2 + textHei, paint);
}
//在Activity中调用
public void setText(String titleMsg) {
("ly","Msg: "+titleMsg);
= titleMsg;
invalidate();
}
}
public class MainActivity extends AppCompatActivity {
private EditText et;
private Button btn;
private ImgTextView itv;
@Override
protected void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
setContentView(.activity_main);
et = ((EditText) findViewById());
btn = ((Button) findViewById());
//所要刷新的View
itv = (ImgTextView) findViewById();
//并不是所要刷新的View
final ImgTextView imgTextView = new ImgTextView(this);
(new () {
@Override
public void onClick(View v) {
String msg = ().toString();
if (msg != null) {
//使用这种方式调用setText(),根本不能刷新文本,
// 原因是imgTextView是自己new出来的不是所要刷新对象
(msg);
//此种方式调用可完美运行,动态刷新文本
(msg);
}
}
});
}
这种错误是很低级,但容易忽略,如果你不是这种原因,那就可以试试网上其他方法,这里就不贴那些方法了。