package com.jasonchen.microlang.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import pl.droidsonroids.gif.GifImageView;
/**
* jasonchen
* 2015/04/10
*/
public class ClipImageView extends GifImageView {
private float clipHorizontalPercent;
private float clipVerticalPercent;
private float clipTopPercent;
private float clipBottomPercent;
private float clipLeftPercent;
private float clipRightPercent;
private Rect rect;
private Paint paint;
public ClipImageView(Context context) {
this(context, null, -1);
}
public ClipImageView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public ClipImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
paint = new Paint();
paint.setColor(Color.GREEN);
}
public void setClipHorizontal(float value) {
if (this.clipHorizontalPercent != value) {
this.clipHorizontalPercent = value;
invalidate();
}
}
public void setClipVertical(float value) {
if (this.clipVerticalPercent != value) {
this.clipVerticalPercent = value;
invalidate();
}
}
public void setClipTop(float value) {
if (this.clipTopPercent != value) {
this.clipTopPercent = value;
invalidate();
}
}
public void setClipBottom(float value) {
if (this.clipBottomPercent != value) {
this.clipBottomPercent = value;
invalidate();
}
}
public void setClipLeft(float value) {
if (this.clipLeftPercent != value) {
this.clipLeftPercent = value;
invalidate();
}
}
public void setClipRight(float value) {
if (this.clipRightPercent != value) {
this.clipRightPercent = value;
invalidate();
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
rect = new Rect(0, 0, w, h);
}
@Override
public void draw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null || (
clipVerticalPercent == 0
&& clipHorizontalPercent == 0
&& clipTopPercent == 0
&& clipBottomPercent == 0
&& clipLeftPercent == 0
&& clipRightPercent == 0)) {
super.draw(canvas);
return;
}
if (!(drawable instanceof BitmapDrawable)) {
super.draw(canvas);
return;
}
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
if (bitmap == null) {
super.draw(canvas);
return;
}
Rect clipRect = new Rect(rect);
int width = clipRect.width();
int height = clipRect.height();
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
int imageViewWidth = width;
int imageViewHeight = height;
float startScale;
int deltaX;
int deltaY;
if ((float) imageViewWidth / bitmapWidth
> (float) imageViewHeight / bitmapHeight) {
startScale = (float) imageViewHeight / bitmapHeight;
} else {
startScale = (float) imageViewWidth / bitmapWidth;
}
bitmapHeight = (int) (bitmapHeight * startScale);
bitmapWidth = (int) (bitmapWidth * startScale);
deltaX = (imageViewWidth - bitmapWidth) / 2;
deltaY = (imageViewHeight - bitmapHeight) / 2;
canvas.save();
int clipV = (int) (this.clipVerticalPercent * bitmapHeight) + deltaY;
int clipH = (int) (this.clipHorizontalPercent * bitmapWidth) + deltaX;
int clipTop = (int) (this.clipTopPercent * bitmapHeight);
int clipBottom = (int) (this.clipBottomPercent * bitmapHeight);
int clipLeft = (int) (this.clipLeftPercent * bitmapWidth);
int clipRight = (int) (this.clipRightPercent * bitmapWidth);
clipRect.set(clipRect.left + clipH + clipLeft,
clipRect.top + clipV + clipTop,
clipRect.right - clipH - clipRight,
clipRect.bottom - clipV - clipBottom);
canvas.clipRect(clipRect);
super.draw(canvas);
canvas.restore();
}
}