Android自定义视图在调用invalidate后显示为纯黑色

在这个代码中,我想在两个ImageView的顶部之间画一条线。 但是,在运行应用程序时,在调用invalidate()之后,自定义视图显示为纯黑色。

这是我的代码:

 public class ArrowView extends RelativeLayout { public Paint paint; public Bitmap eraser; public Canvas cacheCanvas; public float leftX; public float leftY; public float rightX; public float rightY; public boolean update = false; public ImageView iv_leftArrow; public ImageView iv_rightArrow; private int w; private int h; LayoutInflater mInflater; public ArrowView(Context context) { super(context); this.setWillNotDraw(false); mInflater = LayoutInflater.from(context); init(); } public ArrowView(Context context, AttributeSet attrs) { super(context, attrs); this.setWillNotDraw(false); mInflater = LayoutInflater.from(context); init(); } public ArrowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setWillNotDraw(false); mInflater = LayoutInflater.from(context); init(); } @Override public void onSizeChanged(int w, int h, int oldW, int oldH) { this.w = w; this.h = h; super.onSizeChanged(w, h, oldW, oldH); } public void init() { View v = mInflater.inflate(R.layout.arrow_view, this, true); paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLACK); paint.setStrokeWidth(5); v.setBackgroundColor(Color.TRANSPARENT); eraser = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); iv_leftArrow = (ImageView) v.findViewById(R.id.iv_leftarrow); iv_rightArrow = (ImageView) v.findViewById(R.id.iv_rightArrow); cacheCanvas = new Canvas(); cacheCanvas.setBitmap(eraser); } public void setCoordinates(float leftX, float leftY, float rightX, float rightY) { this.leftX = leftX; this.leftY = leftY; this.rightX = rightX; this.rightY = rightY; } @Override public void onDraw(Canvas c) { super.onDraw(c); setCoordinates(iv_leftArrow.getX() + iv_leftArrow.getWidth() / 2, iv_leftArrow.getY(), iv_rightArrow.getX() + iv_rightArrow.getWidth() / 2, iv_rightArrow.getY() ); if (update) { c.drawLine(leftX, leftY, rightX, rightY, paint); update = false; } cacheCanvas.drawPath(p, paint); } } 

调用invalidate()之后,自定义视图显示为纯黑色的原因是什么?

Solutions Collecting From Web of "Android自定义视图在调用invalidate后显示为纯黑色"

通常,系统会自动处理resize,隐藏,显示以及大量其他事物,但是如果绘制像素或后备数据的基础缓冲区已更改或陈旧(有时您将视图上的图像资源交换或原始数据集更改)。 发生这种情况是因为操作系统无法知道数据是以特定方式更改的。

在处理绘图的这些情况下,必须通过Widget.invalidate()告诉系统它的底层数据处于不良状态,重新绘制在主线程上排队,就像您提到的一样。 根据系统实现和Android版本,跟踪由系统进行的更改会有所不同,但我通常所做的是假定系统资源(字节数组,字符数组,资源索引,手动绘制上下文)不被跟踪,并且需要一个无效其他一切都将由系统处理。

来源: 当有必要在视图上执行invalidate()?

如你所知,通过调用onDraw来使用invalidate()来更新视图。

我认为你正在做的是把它设置为true之前调用它 – 所以你的onDraw方法运行与它的声音虚假更新。