You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
ImageView: implement tint attribute
This commit is contained in:
@@ -48,7 +48,8 @@ static int java_paintable_get_intrinsic_width(GdkPaintable *gdk_paintable)
|
|||||||
JNIEnv *env = get_jni_env();
|
JNIEnv *env = get_jni_env();
|
||||||
JavaPaintable *paintable = JAVA_PAINTABLE(gdk_paintable);
|
JavaPaintable *paintable = JAVA_PAINTABLE(gdk_paintable);
|
||||||
jmethodID getIntrinsicWidth = _METHOD(handle_cache.drawable.class, "getIntrinsicWidth", "()I");
|
jmethodID getIntrinsicWidth = _METHOD(handle_cache.drawable.class, "getIntrinsicWidth", "()I");
|
||||||
return (*env)->CallIntMethod(env, paintable->drawable, getIntrinsicWidth);
|
int width = (*env)->CallIntMethod(env, paintable->drawable, getIntrinsicWidth);
|
||||||
|
return width > 0 ? width : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int java_paintable_get_intrinsic_height(GdkPaintable *gdk_paintable)
|
static int java_paintable_get_intrinsic_height(GdkPaintable *gdk_paintable)
|
||||||
@@ -56,12 +57,8 @@ static int java_paintable_get_intrinsic_height(GdkPaintable *gdk_paintable)
|
|||||||
JNIEnv *env = get_jni_env();
|
JNIEnv *env = get_jni_env();
|
||||||
JavaPaintable *paintable = JAVA_PAINTABLE(gdk_paintable);
|
JavaPaintable *paintable = JAVA_PAINTABLE(gdk_paintable);
|
||||||
jmethodID getIntrinsicHeight = _METHOD(handle_cache.drawable.class, "getIntrinsicHeight", "()I");
|
jmethodID getIntrinsicHeight = _METHOD(handle_cache.drawable.class, "getIntrinsicHeight", "()I");
|
||||||
return (*env)->CallIntMethod(env, paintable->drawable, getIntrinsicHeight);
|
int height = (*env)->CallIntMethod(env, paintable->drawable, getIntrinsicHeight);
|
||||||
}
|
return height > 0 ? height : 0;
|
||||||
|
|
||||||
static double java_paintable_get_intrinsic_aspect_ratio(GdkPaintable *gdk_paintable)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void java_paintable_init(JavaPaintable *java_paintable)
|
static void java_paintable_init(JavaPaintable *java_paintable)
|
||||||
@@ -73,7 +70,6 @@ static void java_paintable_paintable_init(GdkPaintableInterface *iface)
|
|||||||
iface->snapshot = java_paintable_snapshot;
|
iface->snapshot = java_paintable_snapshot;
|
||||||
iface->get_intrinsic_height = java_paintable_get_intrinsic_height;
|
iface->get_intrinsic_height = java_paintable_get_intrinsic_height;
|
||||||
iface->get_intrinsic_width = java_paintable_get_intrinsic_width;
|
iface->get_intrinsic_width = java_paintable_get_intrinsic_width;
|
||||||
iface->get_intrinsic_aspect_ratio = java_paintable_get_intrinsic_aspect_ratio;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void java_paintable_class_init(JavaPaintableClass *class)
|
static void java_paintable_class_init(JavaPaintableClass *class)
|
||||||
|
|||||||
@@ -163,15 +163,17 @@ public class Drawable {
|
|||||||
setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
|
setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setColorFilter(int color, PorterDuff.Mode mode) {}
|
public void setColorFilter(int color, PorterDuff.Mode mode) {
|
||||||
|
setColorFilter(new PorterDuffColorFilter(color, mode));
|
||||||
|
}
|
||||||
public void setColorFilter(ColorFilter filter) {}
|
public void setColorFilter(ColorFilter filter) {}
|
||||||
|
|
||||||
public Drawable mutate() {
|
public Drawable mutate() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getIntrinsicWidth() {return 24;}
|
public int getIntrinsicWidth() {return -1;}
|
||||||
public int getIntrinsicHeight() {return 24;}
|
public int getIntrinsicHeight() {return -1;}
|
||||||
|
|
||||||
public void setTintList(ColorStateList tint) {}
|
public void setTintList(ColorStateList tint) {}
|
||||||
|
|
||||||
|
|||||||
@@ -12,12 +12,18 @@ import android.content.res.Resources;
|
|||||||
import android.content.res.Resources.Theme;
|
import android.content.res.Resources.Theme;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.ColorFilter;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
import android.graphics.Rect;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
public class VectorDrawable extends Drawable {
|
public class VectorDrawable extends Drawable {
|
||||||
|
|
||||||
private Bitmap bitmap; // prevent garbage collection
|
private Bitmap bitmap;
|
||||||
|
private Paint paint = new Paint();
|
||||||
|
|
||||||
public VectorDrawable() {
|
public VectorDrawable() {
|
||||||
super();
|
super();
|
||||||
@@ -27,7 +33,10 @@ public class VectorDrawable extends Drawable {
|
|||||||
final int innerDepth = parser.getDepth() + 1;
|
final int innerDepth = parser.getDepth() + 1;
|
||||||
int type;
|
int type;
|
||||||
TypedArray a = r.obtainAttributes(attrs, R.styleable.VectorDrawable);
|
TypedArray a = r.obtainAttributes(attrs, R.styleable.VectorDrawable);
|
||||||
int tint = a.getColor(R.styleable.VectorDrawable_tint, 0);
|
if (a.hasValue(R.styleable.VectorDrawable_tint)) {
|
||||||
|
setColorFilter(a.getColor(R.styleable.VectorDrawable_tint, 0),
|
||||||
|
PorterDuff.Mode.values()[a.getInt(R.styleable.VectorDrawable_tintMode, DEFAULT_TINT_MODE.nativeInt)]);
|
||||||
|
}
|
||||||
float viewportWidth = a.getFloat(R.styleable.VectorDrawable_viewportWidth, 24);
|
float viewportWidth = a.getFloat(R.styleable.VectorDrawable_viewportWidth, 24);
|
||||||
float viewportHeight = a.getFloat(R.styleable.VectorDrawable_viewportHeight, 24);
|
float viewportHeight = a.getFloat(R.styleable.VectorDrawable_viewportHeight, 24);
|
||||||
float width = a.getDimension(R.styleable.VectorDrawable_width, 24);
|
float width = a.getDimension(R.styleable.VectorDrawable_width, 24);
|
||||||
@@ -43,8 +52,8 @@ public class VectorDrawable extends Drawable {
|
|||||||
if (type == XmlPullParser.START_TAG && parser.getName().equals("path")) {
|
if (type == XmlPullParser.START_TAG && parser.getName().equals("path")) {
|
||||||
a = r.obtainAttributes(attrs, R.styleable.VectorDrawablePath);
|
a = r.obtainAttributes(attrs, R.styleable.VectorDrawablePath);
|
||||||
String pathData = a.getString(R.styleable.VectorDrawablePath_pathData);
|
String pathData = a.getString(R.styleable.VectorDrawablePath_pathData);
|
||||||
int fillColor = tint != 0 ? tint : a.getColor(R.styleable.VectorDrawablePath_fillColor, 0);
|
int fillColor = a.getColor(R.styleable.VectorDrawablePath_fillColor, 0);
|
||||||
int strokeColor = tint != 0 ? tint : a.getColor(R.styleable.VectorDrawablePath_strokeColor, 0);
|
int strokeColor = a.getColor(R.styleable.VectorDrawablePath_strokeColor, 0);
|
||||||
float strokeWidth = a.getFloat(R.styleable.VectorDrawablePath_strokeWidth, 0);
|
float strokeWidth = a.getFloat(R.styleable.VectorDrawablePath_strokeWidth, 0);
|
||||||
a.recycle();
|
a.recycle();
|
||||||
sb.append(String.format(Locale.ENGLISH, "<path fill=\"#%06x%02x\" stroke=\"#%06x%02x\" stroke-width=\"%f\" d=\"%s\"/>",
|
sb.append(String.format(Locale.ENGLISH, "<path fill=\"#%06x%02x\" stroke=\"#%06x%02x\" stroke-width=\"%f\" d=\"%s\"/>",
|
||||||
@@ -55,16 +64,25 @@ public class VectorDrawable extends Drawable {
|
|||||||
String svg = sb.toString();
|
String svg = sb.toString();
|
||||||
byte[] bytes = svg.getBytes();
|
byte[] bytes = svg.getBytes();
|
||||||
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
|
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
|
||||||
this.paintable = bitmap.getTexture();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIntrinsicWidth() {
|
public int getIntrinsicWidth() {
|
||||||
return 24; // FIXME
|
return bitmap.getWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIntrinsicHeight() {
|
public int getIntrinsicHeight() {
|
||||||
return 24; // FIXME
|
return bitmap.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setColorFilter(ColorFilter filter) {
|
||||||
|
paint.setColorFilter(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Canvas canvas) {
|
||||||
|
canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), getBounds(), paint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ import android.content.res.ColorStateList;
|
|||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.ColorFilter;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -16,6 +18,7 @@ public class ImageView extends View {
|
|||||||
private Bitmap bitmap = null;
|
private Bitmap bitmap = null;
|
||||||
private ScaleType scaleType = ScaleType.FIT_CENTER;
|
private ScaleType scaleType = ScaleType.FIT_CENTER;
|
||||||
private Drawable drawable = null;
|
private Drawable drawable = null;
|
||||||
|
private ColorFilter colorFilter = null;
|
||||||
|
|
||||||
public ImageView(Context context, AttributeSet attrs) {
|
public ImageView(Context context, AttributeSet attrs) {
|
||||||
this(context, attrs, 0);
|
this(context, attrs, 0);
|
||||||
@@ -30,6 +33,9 @@ public class ImageView extends View {
|
|||||||
|
|
||||||
haveCustomMeasure = false;
|
haveCustomMeasure = false;
|
||||||
TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ImageView, defStyleAttr, 0);
|
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));
|
setImageDrawable(a.getDrawable(com.android.internal.R.styleable.ImageView_src));
|
||||||
setScaleType(scaletype_from_int[a.getInt(com.android.internal.R.styleable.ImageView_scaleType, 3 /*CENTER*/)]);
|
setScaleType(scaletype_from_int[a.getInt(com.android.internal.R.styleable.ImageView_scaleType, 3 /*CENTER*/)]);
|
||||||
a.recycle();
|
a.recycle();
|
||||||
@@ -59,6 +65,10 @@ public class ImageView extends View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setImageDrawable(Drawable drawable) {
|
public void setImageDrawable(Drawable drawable) {
|
||||||
|
if (colorFilter != null) {
|
||||||
|
drawable = drawable.mutate();
|
||||||
|
drawable.setColorFilter(colorFilter);
|
||||||
|
}
|
||||||
this.drawable = drawable;
|
this.drawable = drawable;
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
drawable.setCallback(this);
|
drawable.setCallback(this);
|
||||||
|
|||||||
Reference in New Issue
Block a user