¿Por qué no establece CircleImageView de android support v4 library public?
He notado android.support.v4.widget.CircleImageView
por mucho tiempo. Cada vez que quiero usar un ImageView
en una forma redonda, CircleImageView
aparecería en mi mente. He intentado utilizarlo por muchas veces, pero cada vez, fallé. Debido a que el permiso de acceso de android.support.v4.widget.CircleImageView
es el predeterminado, lo que significa que sólo las clases del mismo paquete con CircleImageView
, a saber, android.support.v4.widget
, pueden acceder a él.
No puedo entender ahora que Round ImageView
se utiliza en común, ¿por qué no se establece CircleImageView
al público para que los desarrolladores no tienen que reemplazar un ImageView
en un Round ImageView? ¿No es que el equipo de Google Android nos obliga a reinventar las ruedas ?
- Problemas de margen de pantalla de inicio?
- Androide: estira la imagen en la vista de la imagen para que se ajuste a la pantalla
- Cómo obtener la imagen de sdcard en android?
- Android imageview obtener el color de píxel de la imagen escalada
- ¿Por qué el ImageView no está en pantalla completa?
¿O no conozco bien este CircleImageView
?
Cualquier sugerencia será apreciada. Gracias por adelantado.
- ¿Cómo leer el margen ImageView mediante programación?
- ¿Por qué ImageXX getX, getY, setX y setY no representan el valor real en el Layout Relativo?
- Gire la vista de imagen alrededor de su centro sin cortar sus bordes
- Mostrar la imagen de réplica con imagen especular en android
- Escala de imagen para rellenar el ancho de ImageView y mantener la relación de aspecto
- ¿Cuál es la diferencia entre ImageView.ScaleType.CENTER_INSIDE y FIT_CENTER?
- El selector no funciona con el diseño y la vista de imagen
- Cómo encontrar la intersección entre dos ImageView cuando arrastrar y soltar?
He intentado copiar y pegar códigos fuente de android.support.v4.widget.CircleImageView
para hacerlo público al igual que esto:
package me.danielpan.youtubelike.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RadialGradient; import android.graphics.Shader; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.support.v4.view.ViewCompat; import android.view.animation.Animation; import android.widget.ImageView; /** * Private class created to work around issues with AnimationListeners being * called before the animation is actually complete and support shadows on older * platforms. * * @hide */ public class CircleImageView extends ImageView { private static final int KEY_SHADOW_COLOR = 0x1E000000; private static final int FILL_SHADOW_COLOR = 0x3D000000; // PX private static final float X_OFFSET = 0f; private static final float Y_OFFSET = 1.75f; private static final float SHADOW_RADIUS = 3.5f; private static final int SHADOW_ELEVATION = 4; private Animation.AnimationListener mListener; private int mShadowRadius; public CircleImageView(Context context, int color, final float radius) { super(context); final float density = getContext().getResources().getDisplayMetrics().density; final int diameter = (int) (radius * density * 2); final int shadowYOffset = (int) (density * Y_OFFSET); final int shadowXOffset = (int) (density * X_OFFSET); mShadowRadius = (int) (density * SHADOW_RADIUS); ShapeDrawable circle; if (elevationSupported()) { circle = new ShapeDrawable(new OvalShape()); ViewCompat.setElevation(this, SHADOW_ELEVATION * density); } else { OvalShape oval = new OvalShadow(mShadowRadius, diameter); circle = new ShapeDrawable(oval); ViewCompat.setLayerType(this, ViewCompat.LAYER_TYPE_SOFTWARE, circle.getPaint()); circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset, KEY_SHADOW_COLOR); final int padding = mShadowRadius; // set padding so the inner image sits correctly within the shadow. setPadding(padding, padding, padding, padding); } circle.getPaint().setColor(color); setBackgroundDrawable(circle); } private boolean elevationSupported() { return android.os.Build.VERSION.SDK_INT >= 21; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (!elevationSupported()) { setMeasuredDimension(getMeasuredWidth() + mShadowRadius*2, getMeasuredHeight() + mShadowRadius*2); } } public void setAnimationListener(Animation.AnimationListener listener) { mListener = listener; } @Override public void onAnimationStart() { super.onAnimationStart(); if (mListener != null) { mListener.onAnimationStart(getAnimation()); } } @Override public void onAnimationEnd() { super.onAnimationEnd(); if (mListener != null) { mListener.onAnimationEnd(getAnimation()); } } /** * Update the background color of the circle image view. * * @param colorRes Id of a color resource. */ public void setBackgroundColorRes(int colorRes) { setBackgroundColor(getContext().getResources().getColor(colorRes)); } @Override public void setBackgroundColor(int color) { if (getBackground() instanceof ShapeDrawable) { ((ShapeDrawable) getBackground()).getPaint().setColor(color); } } private class OvalShadow extends OvalShape { private RadialGradient mRadialGradient; private Paint mShadowPaint; private int mCircleDiameter; public OvalShadow(int shadowRadius, int circleDiameter) { super(); mShadowPaint = new Paint(); mShadowRadius = shadowRadius; mCircleDiameter = circleDiameter; mRadialGradient = new RadialGradient(mCircleDiameter / 2, mCircleDiameter / 2, mShadowRadius, new int[] { FILL_SHADOW_COLOR, Color.TRANSPARENT }, null, Shader.TileMode.CLAMP); mShadowPaint.setShader(mRadialGradient); } @Override public void draw(Canvas canvas, Paint paint) { final int viewWidth = CircleImageView.this.getWidth(); final int viewHeight = CircleImageView.this.getHeight(); canvas.drawCircle(viewWidth / 2, viewHeight / 2, (mCircleDiameter / 2 + mShadowRadius), mShadowPaint); canvas.drawCircle(viewWidth / 2, viewHeight / 2, (mCircleDiameter / 2), paint); } } }
Se ve bien, ¿verdad? No tiene atributos personalizados y parece capaz de ser utilizado como un ImageView
normal.
Pero si lo has probado, descubrirás que NoSuchMethodException
es lanzado. Esta excepción implica que los constructores necesarios no se anulan. De modo que ni siquiera se puede instanciar como una View
normal.
Después de leer estos códigos fuente, me doy cuenta de que CircleImageView
sólo añade sombra detrás de ImageView
, cuyo resultado no es un RoundCornerImageView
o RoundImageView
. Así que si quiero un RoundImageView
, tengo que olvidar esta clase e implementar este efecto reemplazando un ImageView
.
Por último, hay el comentario del archivo, que señala el uso de android.support.v4.widget.CircleImageView
:
Clase privada creada para resolver problemas con AnimationListeners antes de que la animación esté completa y admita sombras en plataformas más antiguas.
Y espero que nadie vuelva a hacer una pregunta tan estúpida y que acabe aquí, ^ _ ^, Haha ~
Según la documentación de esta clase es la clase privada utilizada para trabajar alrededor y no podemos instanciarlo. Puede que esa clase sea removida antes, sospecho.
Hay formas de crear el fondo circular para una vista.
Archivo: drawable / contact_badge_round.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="32dp" android:height="32dp"/> <gradient android:centerColor="#123456" <!--Put your custom color for bg --> android:startColor="#123456" android:endColor="#123456" /> </shape>
Entonces en su diseño de crear un botón y establecer el fondo como contact_badge_round
<ImageView android:id="@+id/roundContact" android:layout_width="32dp" android:layout_height="32dp" android:src="@drawalbe/your_image" android:gravity="center" android:background="@drawable/background_new_entity_symbol" />
- Android – FirebaseApp / Firebase-Inicialización no se inicia
- Desarrollo de aplicaciones de chat de Android