1774becc944de5ddcc1156711809fb3810bffea6dhoford/* 2774becc944de5ddcc1156711809fb3810bffea6dhoford * Copyright (C) 2015 The Android Open Source Project 3774becc944de5ddcc1156711809fb3810bffea6dhoford * 4774becc944de5ddcc1156711809fb3810bffea6dhoford * Licensed under the Apache License, Version 2.0 (the "License"); 5774becc944de5ddcc1156711809fb3810bffea6dhoford * you may not use this file except in compliance with the License. 6774becc944de5ddcc1156711809fb3810bffea6dhoford * You may obtain a copy of the License at 7774becc944de5ddcc1156711809fb3810bffea6dhoford * 8774becc944de5ddcc1156711809fb3810bffea6dhoford * http://www.apache.org/licenses/LICENSE-2.0 9774becc944de5ddcc1156711809fb3810bffea6dhoford * 10774becc944de5ddcc1156711809fb3810bffea6dhoford * Unless required by applicable law or agreed to in writing, software 11774becc944de5ddcc1156711809fb3810bffea6dhoford * distributed under the License is distributed on an "AS IS" BASIS, 12774becc944de5ddcc1156711809fb3810bffea6dhoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13774becc944de5ddcc1156711809fb3810bffea6dhoford * See the License for the specific language governing permissions and 14774becc944de5ddcc1156711809fb3810bffea6dhoford * limitations under the License. 15774becc944de5ddcc1156711809fb3810bffea6dhoford */ 16774becc944de5ddcc1156711809fb3810bffea6dhoford 17774becc944de5ddcc1156711809fb3810bffea6dhofordpackage rs.example.android.com.healingbrush; 18774becc944de5ddcc1156711809fb3810bffea6dhoford 19774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.content.Context; 20774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Bitmap; 21774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Canvas; 22774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Color; 23774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Matrix; 24774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Paint; 25774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Path; 26774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.RectF; 27774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.drawable.Drawable; 28774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.util.AttributeSet; 29774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.view.View; 30774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.widget.ImageView; 31774becc944de5ddcc1156711809fb3810bffea6dhoford 32774becc944de5ddcc1156711809fb3810bffea6dhofordimport java.util.ArrayList; 33774becc944de5ddcc1156711809fb3810bffea6dhofordimport java.util.Arrays; 34774becc944de5ddcc1156711809fb3810bffea6dhoford 35774becc944de5ddcc1156711809fb3810bffea6dhofordpublic class DrawView extends View { 36774becc944de5ddcc1156711809fb3810bffea6dhoford private static final String TAG = "DrawView"; 37774becc944de5ddcc1156711809fb3810bffea6dhoford private ImageView mImageView; 38774becc944de5ddcc1156711809fb3810bffea6dhoford Path mPoints_backup = new Path(); 39774becc944de5ddcc1156711809fb3810bffea6dhoford float[] path = new float[200]; 40774becc944de5ddcc1156711809fb3810bffea6dhoford Path mPoints = new Path(); 41774becc944de5ddcc1156711809fb3810bffea6dhoford int len; 42774becc944de5ddcc1156711809fb3810bffea6dhoford Paint mPaint1; 43774becc944de5ddcc1156711809fb3810bffea6dhoford Paint mPaint2; 44774becc944de5ddcc1156711809fb3810bffea6dhoford private boolean mDone; 45774becc944de5ddcc1156711809fb3810bffea6dhoford ArrayList<Drawable> drawList = new ArrayList<Drawable>(); 46774becc944de5ddcc1156711809fb3810bffea6dhoford 47774becc944de5ddcc1156711809fb3810bffea6dhoford private void setup(Context context) { 48774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint1 = new Paint(); 49774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint2 = new Paint(); 50774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint1.setStyle(Paint.Style.STROKE); 51774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint1.setColor(Color.BLACK); 52774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint1.setStrokeWidth(2); 53774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint2.setStyle(Paint.Style.STROKE); 54774becc944de5ddcc1156711809fb3810bffea6dhoford mPaint2.setColor(Color.YELLOW); 55774becc944de5ddcc1156711809fb3810bffea6dhoford } 56774becc944de5ddcc1156711809fb3810bffea6dhoford 57774becc944de5ddcc1156711809fb3810bffea6dhoford public DrawView(Context context) { 58774becc944de5ddcc1156711809fb3810bffea6dhoford super(context); 59774becc944de5ddcc1156711809fb3810bffea6dhoford setup(context); 60774becc944de5ddcc1156711809fb3810bffea6dhoford } 61774becc944de5ddcc1156711809fb3810bffea6dhoford 62774becc944de5ddcc1156711809fb3810bffea6dhoford public DrawView(Context context, AttributeSet attrs) { 63774becc944de5ddcc1156711809fb3810bffea6dhoford super(context, attrs); 64774becc944de5ddcc1156711809fb3810bffea6dhoford setup(context); 65774becc944de5ddcc1156711809fb3810bffea6dhoford } 66774becc944de5ddcc1156711809fb3810bffea6dhoford 67774becc944de5ddcc1156711809fb3810bffea6dhoford public DrawView(Context context, AttributeSet attrs, int defStyleAttr) { 68774becc944de5ddcc1156711809fb3810bffea6dhoford super(context, attrs, defStyleAttr); 69774becc944de5ddcc1156711809fb3810bffea6dhoford setup(context); 70774becc944de5ddcc1156711809fb3810bffea6dhoford } 71774becc944de5ddcc1156711809fb3810bffea6dhoford 72774becc944de5ddcc1156711809fb3810bffea6dhoford /** 73774becc944de5ddcc1156711809fb3810bffea6dhoford * Assumes imageView is using matrix mode 74774becc944de5ddcc1156711809fb3810bffea6dhoford * 75774becc944de5ddcc1156711809fb3810bffea6dhoford * @param imageView 76774becc944de5ddcc1156711809fb3810bffea6dhoford */ 77774becc944de5ddcc1156711809fb3810bffea6dhoford public void setImageView(ImageView imageView) { 78774becc944de5ddcc1156711809fb3810bffea6dhoford mImageView = imageView; 79774becc944de5ddcc1156711809fb3810bffea6dhoford } 80774becc944de5ddcc1156711809fb3810bffea6dhoford 81774becc944de5ddcc1156711809fb3810bffea6dhoford RectF rec = new RectF(); 82774becc944de5ddcc1156711809fb3810bffea6dhoford 83774becc944de5ddcc1156711809fb3810bffea6dhoford @Override 84774becc944de5ddcc1156711809fb3810bffea6dhoford protected void onDraw(Canvas canvas) { 85774becc944de5ddcc1156711809fb3810bffea6dhoford Matrix m = mImageView.getImageMatrix(); 86774becc944de5ddcc1156711809fb3810bffea6dhoford Drawable d = mImageView.getDrawable(); 87774becc944de5ddcc1156711809fb3810bffea6dhoford canvas.concat(m); 88774becc944de5ddcc1156711809fb3810bffea6dhoford 89774becc944de5ddcc1156711809fb3810bffea6dhoford for (Drawable elem : drawList) { 90774becc944de5ddcc1156711809fb3810bffea6dhoford elem.draw(canvas); 91774becc944de5ddcc1156711809fb3810bffea6dhoford } 92774becc944de5ddcc1156711809fb3810bffea6dhoford canvas.drawPath(mPoints, mPaint1); 93774becc944de5ddcc1156711809fb3810bffea6dhoford canvas.drawPath(mPoints, mPaint2); 94774becc944de5ddcc1156711809fb3810bffea6dhoford } 95774becc944de5ddcc1156711809fb3810bffea6dhoford 96774becc944de5ddcc1156711809fb3810bffea6dhoford public Region getRegion(Bitmap img) { 97774becc944de5ddcc1156711809fb3810bffea6dhoford Region ret = new Region(Arrays.copyOf(path, len), img); 98774becc944de5ddcc1156711809fb3810bffea6dhoford 99774becc944de5ddcc1156711809fb3810bffea6dhoford invalidate(); 100774becc944de5ddcc1156711809fb3810bffea6dhoford return ret; 101774becc944de5ddcc1156711809fb3810bffea6dhoford } 102774becc944de5ddcc1156711809fb3810bffea6dhoford 103774becc944de5ddcc1156711809fb3810bffea6dhoford public void downPoint(float[] imgPoint) { 104774becc944de5ddcc1156711809fb3810bffea6dhoford path[0] = imgPoint[0]; 105774becc944de5ddcc1156711809fb3810bffea6dhoford path[1] = imgPoint[1]; 106774becc944de5ddcc1156711809fb3810bffea6dhoford len = 2; 107774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints_backup.reset(); 108774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints_backup.addPath(mPoints); 109774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.reset(); 110774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.moveTo(imgPoint[0], imgPoint[1]); 111774becc944de5ddcc1156711809fb3810bffea6dhoford } 112774becc944de5ddcc1156711809fb3810bffea6dhoford 113774becc944de5ddcc1156711809fb3810bffea6dhoford public void undo() { 114774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.reset(); 115774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.addPath(mPoints_backup); 116774becc944de5ddcc1156711809fb3810bffea6dhoford } 117774becc944de5ddcc1156711809fb3810bffea6dhoford 118774becc944de5ddcc1156711809fb3810bffea6dhoford public void movePoint(float[] imgMoveList, int size) { 119774becc944de5ddcc1156711809fb3810bffea6dhoford if (len + size * 2 >= path.length) { 120774becc944de5ddcc1156711809fb3810bffea6dhoford path = Arrays.copyOf(path, 2 * (len + size * 2)); 121774becc944de5ddcc1156711809fb3810bffea6dhoford } 122774becc944de5ddcc1156711809fb3810bffea6dhoford for (int i = size * 2 - 2; i >= 0; i -= 2) { 123774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.lineTo(imgMoveList[i], imgMoveList[i + 1]); 124774becc944de5ddcc1156711809fb3810bffea6dhoford path[len] = imgMoveList[i]; 125774becc944de5ddcc1156711809fb3810bffea6dhoford path[len + 1] = imgMoveList[i + 1]; 126774becc944de5ddcc1156711809fb3810bffea6dhoford len += 2; 127774becc944de5ddcc1156711809fb3810bffea6dhoford } 128774becc944de5ddcc1156711809fb3810bffea6dhoford } 129774becc944de5ddcc1156711809fb3810bffea6dhoford 130774becc944de5ddcc1156711809fb3810bffea6dhoford public void upPoint(float[] imgPoint) { 131774becc944de5ddcc1156711809fb3810bffea6dhoford if (len + 2 >= path.length) { 132774becc944de5ddcc1156711809fb3810bffea6dhoford path = Arrays.copyOf(path, 2 * (len + 2)); 133774becc944de5ddcc1156711809fb3810bffea6dhoford } 134774becc944de5ddcc1156711809fb3810bffea6dhoford path[len] = imgPoint[0]; 135774becc944de5ddcc1156711809fb3810bffea6dhoford path[len + 1] = imgPoint[1]; 136774becc944de5ddcc1156711809fb3810bffea6dhoford len += 2; 137774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.lineTo(imgPoint[0], imgPoint[1]); 138774becc944de5ddcc1156711809fb3810bffea6dhoford mPoints.close(); 139774becc944de5ddcc1156711809fb3810bffea6dhoford mDone = true; 140774becc944de5ddcc1156711809fb3810bffea6dhoford } 141774becc944de5ddcc1156711809fb3810bffea6dhoford 142774becc944de5ddcc1156711809fb3810bffea6dhoford public void addDrawable(Drawable d) { 143774becc944de5ddcc1156711809fb3810bffea6dhoford drawList.add(d); 144774becc944de5ddcc1156711809fb3810bffea6dhoford } 145774becc944de5ddcc1156711809fb3810bffea6dhoford 146774becc944de5ddcc1156711809fb3810bffea6dhoford public void clearDrawables() { 147774becc944de5ddcc1156711809fb3810bffea6dhoford drawList.clear(); 148774becc944de5ddcc1156711809fb3810bffea6dhoford } 149774becc944de5ddcc1156711809fb3810bffea6dhoford} 150