package android.widget; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.ColorFilter; import android.graphics.Matrix; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; public class ImageView extends View { private Bitmap bitmap = null; private ScaleType scaleType = ScaleType.FIT_CENTER; private Drawable drawable = null; private ColorFilter colorFilter = null; public ImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ImageView(Context context) { this(context, null); } public ImageView(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public ImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); haveCustomMeasure = false; TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ImageView, defStyleAttr, 0); if (a.hasValue(com.android.internal.R.styleable.ImageView_tint)) colorFilter = new PorterDuffColorFilter(a.getColor(com.android.internal.R.styleable.ImageView_tint, 0), PorterDuff.Mode.values()[a.getInt(com.android.internal.R.styleable.ImageView_tintMode, PorterDuff.Mode.SRC_IN.nativeInt)]); setImageDrawable(a.getDrawable(com.android.internal.R.styleable.ImageView_src)); if (a.hasValue(com.android.internal.R.styleable.ImageView_scaleType)) setScaleType(scaletype_from_int[a.getInt(com.android.internal.R.styleable.ImageView_scaleType, 3 /*CENTER*/)]); a.recycle(); } public void setImageResource(final int resid) { if (Context.this_application.getResources().getString(resid).endsWith(".xml")) { setImageDrawable(getResources().getDrawable(resid)); return; } bitmap = BitmapFactory.decodeResource(Context.this_application.getResources(), resid); native_setDrawable(widget, bitmap.getTexture()); } public void setAdjustViewBounds(boolean adjustViewBounds) {} public void setScaleType(ScaleType scaleType) { this.scaleType = scaleType; native_setScaleType(widget, scaleType.nativeInt); } public ScaleType getScaleType() { return scaleType; } public Drawable getDrawable() { return drawable; } public void setImageDrawable(Drawable drawable) { if (drawable != null && colorFilter != null) { drawable = drawable.mutate(); drawable.setColorFilter(colorFilter); } if (this.drawable != null) { this.drawable.setCallback(null); } this.drawable = drawable; if (drawable != null) { drawable.setCallback(this); } native_setDrawable(widget, drawable != null ? drawable.paintable : 0); } public void setImageMatrix(Matrix matrix) {} public void setImageBitmap(Bitmap bitmap) { if (bitmap != null) native_setDrawable(widget, bitmap.getTexture()); } /** * Options for scaling the bounds of an image to the bounds of this view. */ public enum ScaleType { /** * Scale using the image matrix when drawing. The image matrix can be set using * {@link ImageView#setImageMatrix(Matrix)}. From XML, use this syntax: * android:scaleType="matrix". */ MATRIX(0), /** * Scale the image using {@link Matrix.ScaleToFit#FILL}. * From XML, use this syntax: android:scaleType="fitXY". */ FIT_XY(1), /** * Scale the image using {@link Matrix.ScaleToFit#START}. * From XML, use this syntax: android:scaleType="fitStart". */ FIT_START(2), /** * Scale the image using {@link Matrix.ScaleToFit#CENTER}. * From XML, use this syntax: * android:scaleType="fitCenter". */ FIT_CENTER(3), /** * Scale the image using {@link Matrix.ScaleToFit#END}. * From XML, use this syntax: android:scaleType="fitEnd". */ FIT_END(4), /** * Center the image in the view, but perform no scaling. * From XML, use this syntax: android:scaleType="center". */ CENTER(5), /** * Scale the image uniformly (maintain the image's aspect ratio) so * that both dimensions (width and height) of the image will be equal * to or larger than the corresponding dimension of the view * (minus padding). The image is then centered in the view. * From XML, use this syntax: android:scaleType="centerCrop". */ CENTER_CROP(6), /** * Scale the image uniformly (maintain the image's aspect ratio) so * that both dimensions (width and height) of the image will be equal * to or less than the corresponding dimension of the view * (minus padding). The image is then centered in the view. * From XML, use this syntax: android:scaleType="centerInside". */ CENTER_INSIDE(7); ScaleType(int ni) { nativeInt = ni; } final int nativeInt; } private final ScaleType[] scaletype_from_int = { ScaleType.MATRIX, ScaleType.FIT_XY, ScaleType.FIT_START, ScaleType.FIT_CENTER, ScaleType.FIT_END, ScaleType.CENTER, ScaleType.CENTER_CROP, ScaleType.CENTER_INSIDE, }; public final void setColorFilter(int color, PorterDuff.Mode mode) {} public void setImageTintList(ColorStateList tint) { colorFilter = new PorterDuffColorFilter(tint.getDefaultColor(), PorterDuff.Mode.SRC_IN); setImageDrawable(drawable); } public void setImageAlpha(int alpha) {} public void setMaxWidth(int width) {} public void setMaxHeight(int height) {} public void setImageState(int[] state, boolean merge) {} public ColorStateList getImageTintList() { return null; } public PorterDuff.Mode getImageTintMode() { return null; } public void setImageTintMode(PorterDuff.Mode tintMode) {} public void setCropToPadding(boolean crop) {} public void setColorFilter(int color) {} @Override protected native long native_constructor(Context context, AttributeSet attrs); protected native void native_setDrawable(long widget, long paintable); protected native void native_setScaleType(long widget, int scale_type); }