Android – add button to graphic canvas
I am using the answer to this question: drawing on canvas and save image to create a canvas to draw an image
I am opening a fragmentactivity called DrawImage when a button is clicked. In this activity, I want mydrawview to be displayed together with the floating action button, allowing users to save their drawings when clicked
This is how I am currently displaying the canvas, but I don't know how to add buttons on it. Do you have any ideas?
DrawImage for
public class DrawImage extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View drawImageCanvas = new MyDrawView(this.getApplicationContext());
setContentView(drawImageCanvas);
}
}
Mydrawview (same as link)
public class MyDrawView extends View {
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;
public MyDrawView(Context c) {
super(c);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0xFF000000);
mPaint.setStyle(Paint.Style.stroke);
mPaint.setstrokeJoin(Paint.Join.ROUND);
mPaint.setstrokeCap(Paint.Cap.ROUND);
mPaint.setstrokeWidth(3);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;
private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}
private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
}
public void clear(){
mBitmap.eraseColor(Color.TRANSPARENT);
invalidate();
System.gc();
}
}
resolvent:
You only set contentview as mydrawview view, so there are no more views (buttons) in the layout. It is impossible to add buttons in this way
The solution is to move mydrawview to an XML file (fragment_draw_image. XML) and set the content v
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.misah.test.MyDrawView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save Drawing"/>
</RelativeLayout>
Then setcontentview (r.layout.fragment_draw_image); In a layout, you can draw views and buttons above it, as well as anything else you want
Edit:
This constructor is also added to mydrawview, which you can use from XML:
public MyDrawView(Context c) {
super(c);
init();
}
public MyDrawView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MyDrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public MyDrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
And add all Doints in the constructor to the init method (drawing, etc.)