¿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 ?

¿O no conozco bien este CircleImageView ?

Cualquier sugerencia será apreciada. Gracias por adelantado.

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 ImageView no está mostrando la imagen?
  • Propiedad marginRight de imageview no funciona
  • Crear diseño de las imágenes sin asignarlas layoutparams estáticos en android
  • Android, Java, Creación de una miniatura que mantiene la relación de aspecto
  • Vista de imagen que no envuelve contenido
  • Android ¿Arrastrar y soltar imágenes en la pantalla?
  • Android.view.InflateException: al escribir una imagen personalizada
  • Estirar imagen en ImageView
  • Cómo agregar una sombra y un borde en circular imageView android?
  • SetImageBitmap no tiene efecto visible
  • Android - Dos imágenes vistas lado a lado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.