Android:在由 ImageView 中的位图确定的框架内绘制



我想创建一个窗口,用户可以在其中走出图像的边界,但路径会继续。

我的活动有此代码

public class PaintActivity extends Activity {
PaintView maskView;
ImageView imagen;
Bitmap bitmap;
Bitmap mask;
int bitmapWidth, bitmapHeight;
public int[] getBitmapMinCoords() {
    float[] minCoordF = {0, 0};
    Matrix matriz = imagen.getImageMatrix();
    matriz.mapPoints(minCoordF);
    int[] minCoords = new int[2];
    minCoords[0] = Math.round(minCoordF[0]);
    minCoords[1] = Math.round(minCoordF[1]);
    return minCoords;
}
public int[] getBitmapMaxCoords() {
    float[] maxCoordF = {bitmapWidth, bitmapHeight};
    Matrix matriz = imagen.getImageMatrix();
    matriz.mapPoints(maxCoordF);
    int[] maxCoords = new int[2];
    maxCoords[0] = Math.round(maxCoordF[0]);
    maxCoords[1] = Math.round(maxCoordF[1]);
    return maxCoords;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.paint);
    imagen = (ImageView) findViewById(R.id.image_paint);
    maskView = (PaintView) findViewById(R.id.mask_paint);
    String imagePath = "/sdcard/images/NewOrleans.gif";
    bitmap = BitmapFactory.decodeFile(imagePath);
    imagen.setImageBitmap(bitmap);
    bitmapWidth = bitmap.getWidth();
    bitmapHeight = bitmap.getHeight();
    ViewTreeObserver vto = imagen.getViewTreeObserver();      
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {          
         public void onGlobalLayout() {              
            Matrix matrizTransformacion = imagen.getImageMatrix();
            float[] values = new float[9];
            if (matrizTransformacion != null) {
                matrizTransformacion.getValues(values);
                Log.i(PaintActivity.class.toString() + ".globalListener()", "La matriz tiene valores: " + matrizTransformacion.toString() );
            }
            int[] minC = getBitmapMinCoords();
            int[] maxC = getBitmapMaxCoords();
            Log.i("Listener MinCOORDS (0,0)", minC[0] + ", " + minC[1]);
            Log.i("Listener MaxCOORDS (" + bitmapWidth + "," + bitmapHeight + ")", maxC[0] + ", " + maxC[1]);
            Bitmap mapaBits = Bitmap.createBitmap( bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(mapaBits);
            maskView.layout(minC[0], minC[1], maxC[0], maxC[1]);
            maskView.draw(canvas);
            maskView.refreshDrawableState();
            imagen.getViewTreeObserver().removeGlobalOnLayoutListener(this);        
         }      
    });  
}
Bitmap getMaskBitmap(View view) {
    Matrix matrizTransformacion = imagen.getImageMatrix();
    float[] values = new float[9];
    if (matrizTransformacion != null) {
        matrizTransformacion.getValues(values);
        Log.i(PaintActivity.class.toString() + ".onStart()", "La matriz tiene valores: " + matrizTransformacion.toString() );
    }
    Bitmap mapaBits = Bitmap.createBitmap( Math.round(bitmapWidth*values[0]), Math.round(bitmapHeight*values[4]), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(mapaBits);
    int[] minCoords = getBitmapMinCoords();
    int[] maxCoords = getBitmapMaxCoords();
    view.layout(minCoords[0], minCoords[1], maxCoords[0], maxCoords[1]);
    view.draw(canvas);
    return mapaBits;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.inpainting_color_selection_menu, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.inpainting_color_accept_opt:
        ProgressDialog pd = ProgressDialog.show(this, "", "Guardando imagen");
        Bitmap mascara = getMaskBitmap(maskView);

        // GUARDANDO BITMAP EN HDD
        try {
            String filename = "/sdcard/PhotoRestore/mask.png";
            File file = new File(filename);
            FileOutputStream out = new FileOutputStream(file);
            mascara.compress(Bitmap.CompressFormat.PNG, 100, out);
        } catch (Exception e) {
            e.printStackTrace();
        }

        pd.dismiss();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
}

这是我的画图的代码

public class PaintView extends View {
    float previousX = -1;
    float previousY = -1;
    float currentX = -1;
    float currentY = -1;
    PaintActivity activity;
    Path path;
    Paint paintLine = new Paint();
    public PaintView(Context context) {
        super(context);
        init();
    }
    public PaintView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public PaintView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    private void init() {
        path = new Path();
        activity = (PaintActivity) getContext();
        paintLine = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintLine.setStyle(Paint.Style.STROKE);
        paintLine.setStrokeWidth(10);
        paintLine.setColor(Color.GREEN);
        paintLine.setAlpha(150);
    }
    public void onDraw(Canvas canvas) {
        canvas.drawPath(path, paintLine);
    }
    @Override
    public boolean onTouchEvent(final MotionEvent event) {
        currentX = event.getX();
        currentY = event.getY();
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(currentX, currentY);
                break;
            case MotionEvent.ACTION_MOVE:
                path.quadTo(previousX, previousY, currentX, currentY);
                break;
            case MotionEvent.ACTION_UP:
                path.quadTo(previousX, previousY, currentX, currentY);
                break;
            }
            previousX = currentX;
            previousY = currentY;
            postInvalidate();
            return true;
    }
}

这是我的 XML 视图

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/image_paint"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/hola" />
    <com.paint.PaintView
        android:id="@+id/mask_paint"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

当我按下我在菜单中添加的按钮时,我将图像保存在内存中,屏幕继续存在,但现在我有一个边框。远离这个边界的路径继续绘制,但它被遮挡在黑色表面下,路径没有被切割,这就是我想在活动开始时发生的。

我尝试在活动的"onCreate(("方法(在全局布局侦听器内(中执行相同的操作,但它无法运行。

有人可以帮助我吗?

首先,失去感谢!

我找到了解决问题的方法。我需要放置view.layout()的位置是在要调整布局大小的视图的onDraw()方法中。

最新更新