package in.srain.cube.demo.ui.fragment;
import android.graphics.*;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import in.srain.cube.demo.R;
import in.srain.cube.mints.base.TitleBaseFragment;
public class BitmapFragment extends TitleBaseFragment {
private RectF mTempSrc = new RectF();
private RectF mTempDst = new RectF();
private static final Matrix.ScaleToFit[] sS2FArray = {Matrix.ScaleToFit.FILL, Matrix.ScaleToFit.START, Matrix.ScaleToFit.CENTER, Matrix.ScaleToFit.END};
@Override
protected View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHeaderTitle("Bitmap");
int vwidth = 720;
int vheight = 720;
View view = inflater.inflate(R.layout.fragment_bitmap, null);
ImageView imageView = (ImageView) view.findViewById(R.id.iv_bitmap);
imageView.setBackgroundColor(Color.parseColor("#b8ebf7"));
imageView.setLayoutParams(new LinearLayout.LayoutParams(vwidth, vheight));
ScaleType scaleType = ScaleType.FIT_CENTER;
Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.pic2);
Matrix matrix = configureBounds(src, vwidth, vheight, ScaleType.FIT_END, new Matrix());
RectF srcRectF = new RectF(0, 0, 480, 360);
RectF rect = new RectF();
matrix.mapRect(rect, srcRectF);
Log.d("test", String.format("mapRect: %s => %s", srcRectF, rect));
Rect srcRect = new Rect(0, 0, 480, 360);
Bitmap bitmap = convert(src, srcRect, 480, 480, scaleType, matrix);
Log.d("test", String.format("%s %s => %s %s", src.getWidth(), src.getHeight(), bitmap.getWidth(), bitmap.getHeight()));
imageView.setImageBitmap(bitmap);
return view;
}
private Bitmap convert1(Bitmap src, Rect srcR, int width, int height, ScaleType scaleType, Matrix m) {
return null;
}
private Matrix configureBounds(Bitmap src, int vwidth, int vheight, ScaleType mScaleType, Matrix mMatrix) {
Matrix mDrawMatrix = new Matrix();
int dwidth = src.getWidth();
int dheight = src.getHeight();
boolean fits = (dwidth < 0 || vwidth == dwidth) && (dheight < 0 || vheight == dheight);
if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) {
mDrawMatrix = null;
} else {
if (ScaleType.MATRIX == mScaleType) {
// Use the specified matrix as-is.
if (mMatrix.isIdentity()) {
mDrawMatrix = null;
} else {
mDrawMatrix = mMatrix;
}
} else if (fits) {
// The bitmap fits exactly, no transform needed.
mDrawMatrix = null;
} else if (ScaleType.CENTER == mScaleType) {
// Center bitmap in view, no scaling.
mDrawMatrix = mMatrix;
mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f), (int) ((vheight - dheight) * 0.5f + 0.5f));
} else if (ScaleType.CENTER_CROP == mScaleType) {
mDrawMatrix = mMatrix;
float scale;
float dx = 0, dy = 0;
if (dwidth * vheight > vwidth * dheight) {
scale = (float) vheight / (float) dheight;
dx = (vwidth - dwidth * scale) * 0.5f;
} else {
scale = (float) vwidth / (float) dwidth;
dy = (vheight - dheight * scale) * 0.5f;
}
mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
} else if (ScaleType.CENTER_INSIDE == mScaleType) {
mDrawMatrix = mMatrix;
float scale;
float dx;
float dy;
if (dwidth <= vwidth && dheight <= vheight) {
scale = 1.0f;
} else {
scale = Math.min((float) vwidth / (float) dwidth, (float) vheight / (float) dheight);
}
dx = (int) ((vwidth - dwidth * scale) * 0.5f + 0.5f);
dy = (int) ((vheight - dheight * scale) * 0.5f + 0.5f);
mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate(dx, dy);
} else {
// Generate the required transform.
mTempSrc.set(0, 0, dwidth, dheight);
mTempDst.set(0, 0, vwidth, vheight);
mDrawMatrix = mMatrix;
mDrawMatrix.setRectToRect(mTempSrc, mTempDst, sS2FArray[mScaleType.ordinal() - 1]);
}
}
return mDrawMatrix;
}
private Bitmap convert(Bitmap src, Rect srcR, int width, int height, ScaleType scaleType, Matrix m) {
int neww = width;
int newh = height;
Canvas canvas = new Canvas();
Bitmap bitmap;
Paint paint;
RectF dstR = new RectF(0, 0, neww, newh);
Config newConfig = Config.ARGB_8888;
final Config config = src.getConfig();
// GIF files generate null configs, assume ARGB_8888
if (config != null) {
switch (config) {
case RGB_565:
newConfig = Config.RGB_565;
break;
case ALPHA_8:
newConfig = Config.ALPHA_8;
break;
// noinspection deprecation
case ARGB_4444:
case ARGB_8888:
default:
newConfig = Config.ARGB_8888;
break;
}
}
if (m == null || m.isIdentity()) {
bitmap = Bitmap.createBitmap(neww, newh, newConfig);
paint = null; // not needed
} else {
final boolean transformed = !m.rectStaysRect();
RectF deviceR = new RectF();
RectF srcRectF = new RectF(srcR.left, srcR.top, srcR.width(), srcR.height());
// RectF src1 = new RectF(0, 0,);
m.mapRect(deviceR, dstR);
dstR = deviceR;
bitmap = Bitmap.createBitmap(neww, newh, transformed ? Config.ARGB_8888 : newConfig);
Log.d("test", String.format("map: %s, %s => %s", srcR, srcRectF, deviceR));
canvas.concat(m);
paint = new Paint();
// paint.setFilterBitmap(filter);
if (transformed) {
paint.setAntiAlias(true);
}
}
// The new bitmap was created from a known bitmap source so assume that
// they use the same density
bitmap.setDensity(src.getDensity());
canvas.setBitmap(bitmap);
// srcR = new Rect(0, 0, 480, 360);
// canvas.translate(0, -120);
// dstR = new RectF(0, 0, 480, 480);
// dstR = new RectF(0, 0, width, height);
canvas.drawBitmap(src, srcR, dstR, paint);
Log.d("test", String.format("drawBitmap %s => %s, %sx%s", srcR, dstR, canvas.getWidth(), canvas.getHeight()));
canvas.setBitmap(null);
return bitmap;
}
}