Vikalp Patel
Vikalp Patel

Reputation: 10887

Custom ImageView fits to its parent width and height

I've been creating Image Processing Application. Where Image get's blackened(Technically drawing on canvas with paint and path on TouchEvent).

Here's my layout which i used for Blackened Screen

<?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">

<FrameLayout
    android:id="@+id/blacken_imageview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
     />
</FrameLayout>

In Blacken Activity :

public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.drawingpad_layout);
 drawingPadLayout = (FrameLayout) findViewById(R.id.blacken_imageview);
 mDrawingView=new DrawingView(this);
 mDrawingView.setBackgroundDrawable(Drawable.createFromPath(imagePath)); // getting imagepath from previous activity.
 mDrawingView.setScaleType(ScaleType.FIT_CENTER);//I tried CENTER, CENTER_INSIDE i.e every scaleType. But it's doesn't change the ImageView Background scale type at all
 drawingPadLayout.addView(mDrawingView);
 }

Q.

No matter what scaleType applied to DrawingView. DrawingView background tht's image is getting streched to Fit Screen. Seems like DrawingView background tries to match it's parent i.e FrameLayout How should i avoid these?.

I want Image background shouldn't get stretched to match the screen. It should remain intact.

DashBoard Image Blacken Image ScreenApplied Blacken with Touch Event


Here's my custom ImageView which i used to blacken on touch of it.

class DrawingView extends ImageView {
Paint mPaint;
Bitmap mBitmap;
Canvas mCanvas;
Path mPath;
Paint mBitmapPaint;

public DrawingView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(20);

    mPath = new Path();
    mBitmapPaint = new Paint();
    mBitmapPaint.setColor(Color.BLACK);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.draw(canvas);
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mPaint);
}

private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x, float y) {
    // mPath.reset();
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}

private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        mX = x;
        mY = y;
    }
}

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
    // kill this so we don't double draw
    mPath.reset();
    // mPath= new Path();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        touch_start(x, y);
        invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        touch_move(x, y);
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        touch_up();
        invalidate();
        break;
    }
    return true;
}
 }

Upvotes: 1

Views: 1015

Answers (1)

Vikalp Patel
Vikalp Patel

Reputation: 10887

As per Pskink,

Replacing setBackgroundDrawable to setImageDrawable resolved the issue. Image is not getting streched any more. It remains intact.

mDrawingView.setImageDrawable(Drawable.createFromPath(imagePath)); 

Upvotes: 1

Related Questions