Я пытаюсь получить панель с холстом, содержащим изображение, которое я поместу поверх другого изображения, и когда я коснусь экрана, верхнее (наложенное) изображение будет стерто с помощью PoerterDuffXfermode (PorterDuff.Mode) и т. Д. Во всяком случае, у меня есть функциональность, сделанная и очищенная благодаря помощи парня на этом форуме, который предоставил некоторый код, который в основном выполнял именно то, что мне нужно, но у меня есть одна небольшая проблема - реализация кода парнями, не позволит мне правильно ссылаться на класс Panel в XML, чтобы поместить Panel в предварительно определенный файл XML (main.xml). это дает мне ошибку с указанием
Пользовательская панель просмотра не использует конструкторы представления с 2 или 3 аргументами; Атрибуты XML не будут работать
Вот так выглядит мой xml в базовом масштабе (просто вид на месте во внешнем линейном макете).
<com.easyscratch.full.Panel
xmlns:android="http://schemas.android.com/apk/res/android"
android:id ="@+id/easyCustView"
android:layout_width="300dp"
android:layout_height="300dp"
android:visibility="visible"
android:focusableInTouchMode="true"/>
Ява выглядит следующим образом. (КЛАСС ПАНЕЛИ)
package com.easyscratch.full;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
class Panel extends View
{
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
Bitmap bitmap;
Canvas pcanvas ;
int x = 0;
int y =0;
int r =0;
public Panel(Context context) {
super(context);
Log.v("Panel", ">>>>>>");
setFocusable(true);
setBackgroundColor(Color.GREEN);
// setting paint
mPaint = new Paint();
mPaint.setAlpha(0);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mPaint.setAntiAlias(true);
// getting image from resources
Resources r = this.getContext().getResources();
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.foreground_image);
// converting image bitmap into mutable bitmap
bitmap = Bitmap.createBitmap(295, 260, Config.ARGB_8888);
pcanvas = new Canvas();
pcanvas.setBitmap(bitmap); // drawXY will result on that Bitmap
pcanvas.drawBitmap(bm, 0, 0, null);
}
@Override
protected void onDraw(Canvas canvas) {
// draw a circle that is erasing bitmap
pcanvas.drawCircle(x, y, r, mPaint);
canvas.drawBitmap(bitmap, 0, 0,null);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// set paramete to draw circle on touch event
x = (int) event.getX();
y = (int) event.getY();
r =20;
// Atlast invalidate canvas
invalidate();
return true;
}
}
ОСНОВНОЙ ГЛАВНЫЙ КЛАСС ВЫЗОВ MAIN.XML
package com.easyscratch.full;
import android.app.Activity;
import android.os.Bundle;
public class easyscratch extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
,, Если бы только кто-нибудь сказал мне, что я делаю неправильно, или, может быть, альтернативная реализация
public Panel(Context context) {
super(context);
в любом случае, большое спасибо в продвинутой версии, мы очень скоро поможем:)
Приветствия, парни!