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.
0 comments:
Post a Comment