blob: 29953692e41b3fff660a2458b424662cbc695b3f [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package rs.example.android.com.healingbrush;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.Arrays;
public class DrawView extends View {
private static final String TAG = "DrawView";
private ImageView mImageView;
Path mPoints_backup = new Path();
float[] path = new float[200];
Path mPoints = new Path();
int len;
Paint mPaint1;
Paint mPaint2;
private boolean mDone;
ArrayList<Drawable> drawList = new ArrayList<Drawable>();
private void setup(Context context) {
mPaint1 = new Paint();
mPaint2 = new Paint();
mPaint1.setStyle(Paint.Style.STROKE);
mPaint1.setColor(Color.BLACK);
mPaint1.setStrokeWidth(2);
mPaint2.setStyle(Paint.Style.STROKE);
mPaint2.setColor(Color.YELLOW);
}
public DrawView(Context context) {
super(context);
setup(context);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
setup(context);
}
public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setup(context);
}
/**
* Assumes imageView is using matrix mode
*
* @param imageView
*/
public void setImageView(ImageView imageView) {
mImageView = imageView;
}
RectF rec = new RectF();
@Override
protected void onDraw(Canvas canvas) {
Matrix m = mImageView.getImageMatrix();
Drawable d = mImageView.getDrawable();
canvas.concat(m);
for (Drawable elem : drawList) {
elem.draw(canvas);
}
canvas.drawPath(mPoints, mPaint1);
canvas.drawPath(mPoints, mPaint2);
}
public Region getRegion(Bitmap img) {
Region ret = new Region(Arrays.copyOf(path, len), img);
invalidate();
return ret;
}
public void downPoint(float[] imgPoint) {
path[0] = imgPoint[0];
path[1] = imgPoint[1];
len = 2;
mPoints_backup.reset();
mPoints_backup.addPath(mPoints);
mPoints.reset();
mPoints.moveTo(imgPoint[0], imgPoint[1]);
}
public void undo() {
mPoints.reset();
mPoints.addPath(mPoints_backup);
}
public void movePoint(float[] imgMoveList, int size) {
if (len + size * 2 >= path.length) {
path = Arrays.copyOf(path, 2 * (len + size * 2));
}
for (int i = size * 2 - 2; i >= 0; i -= 2) {
mPoints.lineTo(imgMoveList[i], imgMoveList[i + 1]);
path[len] = imgMoveList[i];
path[len + 1] = imgMoveList[i + 1];
len += 2;
}
}
public void upPoint(float[] imgPoint) {
if (len + 2 >= path.length) {
path = Arrays.copyOf(path, 2 * (len + 2));
}
path[len] = imgPoint[0];
path[len + 1] = imgPoint[1];
len += 2;
mPoints.lineTo(imgPoint[0], imgPoint[1]);
mPoints.close();
mDone = true;
}
public void addDrawable(Drawable d) {
drawList.add(d);
}
public void clearDrawables() {
drawList.clear();
}
}