Создание ластика для приложения для рисования Android
Я работаю над приложением для рисования и довольно близок к выпуску, но у меня есть проблемы с частью ластика приложения. У меня есть 2 основных экрана (фрагменты), один из которых представляет собой чистый белый холст, на котором пользователь может рисовать с некоторыми опциями и так далее. Другой - это фрагмент заметок. Этот фрагмент заметок выглядит как блокнот. Таким образом, для стирания фрагмента рисунка я могу просто использовать фон холста, и пользователь не почувствует разницу. На фрагменте заметки я не могу этого сделать, потому что мне нужно держать фон в такте. Я посмотрел в режимах PorterDuffer и попробовал чистую версию и попытался нарисовать на отдельном растровом изображении, но ничего не помогло. Если бы был способ контролировать то, что привлекает внимание, то это было бы полезно. Я открыт для любых предложений, я не могу заставить что-либо работать.
Я также поиграл с включением кэша рисования перед удалением, и это не работает. Кроме того, я попытался включить аппаратное обеспечение, и это привело к странному поведению моего пользовательского представления. Ниже приведен соответствующий код. Мои методы on draw проходят множество путей, потому что я опрашиваю их, чтобы учесть некоторые другие функциональные возможности.
@Override
protected void onDraw(Canvas canvas) {
//draw the backgroumd type
if(mDrawBackground) {
//draw the background
//if the bitmap is not null draw it as the background, otherwise we are in a note view
if(mBackgroundBitmap != null) {
canvas.drawBitmap(mBackgroundBitmap, 0, 0, backPaint);
} else {
drawBackgroundType(mBackgroundType, canvas);
}
}
for (int i = 0; i < paths.size(); i++ ) {
//Log.i("DRAW", "On draw: " + i);
//draw each previous path.
mDrawPaint.setStrokeWidth(strokeSizes.get(i));
mDrawPaint.setColor(colors.get(i));
canvas.drawPath(paths.get(i), mDrawPaint);
}
//set paint attributes to the current value
mDrawPaint.setStrokeWidth(strokeSize);
mDrawPaint.setColor(mDrawColor);
canvas.drawPath(mPath, mDrawPaint);
}
и мой метод рисования фона
/**
* Method that actually draws the notebook paper background
* @param canvas the {@code Canvas} to draw on.
*/
private void drawNoteBookPaperBackground(Canvas canvas) {
//create bitmap for the background and a temporary canvas.
mBackgroundBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBackgroundBitmap);
//set the color to white.
mBackgroundBitmap.eraseColor(Color.WHITE);
//get the height and width of the view minus padding.
int height = getHeight() - getPaddingTop() - getPaddingBottom();
int width = getWidth() - getPaddingLeft() - getPaddingRight();
//figure out how many lines we can draw given a certain line width.
int lineWidth = 50;
int numOfLines = Math.round(height / lineWidth);
Log.i("DRAWVIEW", "" + numOfLines);
//iterate through the number of lines and draw them.
for(int i = 0; i < numOfLines * lineWidth; i+=lineWidth) {
mCanvas.drawLine(0+getPaddingLeft(), i+getPaddingTop(), width, i+getPaddingTop(), mNoteBookPaperLinePaint);
}
//now we need to draw the vertical lines on the left side of the view.
float startPoint = 30;
//set the color to be red.
mNoteBookPaperLinePaint.setColor(getResources().getColor(R.color.notebook_paper_vertical_line_color));
//draw first line
mCanvas.drawLine(startPoint, 0, startPoint, getHeight(), mNoteBookPaperLinePaint);
//space the second line next to the first one.
startPoint+=20;
//draw the second line
mCanvas.drawLine(startPoint, 0, startPoint, getHeight(), mNoteBookPaperLinePaint);
//reset the paint color.
mNoteBookPaperLinePaint.setColor(getResources().getColor(R.color.notebook_paper_horizontal_line_color));
canvas.drawBitmap(mBackgroundBitmap, 0, 0, backPaint);
}
1 ответ
Всем, кто видит этот вопрос, я подумал, что добавлю, как я решил проблему. Я создаю фоновое растровое изображение в моем пользовательском представлении, а затем передаю его фрагменту моего хостинга. Затем фрагмент устанавливает это растровое изображение в качестве фона для содержащей группы представлений, поэтому при использовании Xfermode PorterDuff.CLEAR прорисованные пути очищаются, но фон в родительском фрагменте остается нетронутым.