Thursday, June 9, 2016

Android Custom View shows solid black after calling invalidate

Leave a Comment

In this code, I would like to draw a line between the top of two ImageViews. However, when running the app, the custom view is shown solid black after calling invalidate().

Here is my code:

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);     } } 

Is there any reason why the custom view is showing as solid black after calling invalidate()?

1 Answers

Answers 1

As you know, invalidate() is used to update a view by a call to onDraw.

What I think you were doing was calling it before setting update to true - so your onDraw method ran with a false update by the sounds of it.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment