pkmmte / circularimageview Goto Github PK
View Code? Open in Web Editor NEWCustom view for circular images in Android while maintaining the best draw performance
License: MIT License
Custom view for circular images in Android while maintaining the best draw performance
License: MIT License
I get the following errors in the Preview tab when I add a CircularImageView
to an XML layout:
Rendering Problems
Missing styles. Is the correct theme chosen for this layout?
Failed to find style 'circularImageViewStyle' in current theme (3 similar errors not shown)
I'm guessing it's got something to do with these lines in res/values/attrs.xml.
You can't change the license from CC to MIT since you based it on the CC licensed code and removed the original users name.
Hi got this exception.
basically i call the below statement twice but OwnerProfilePictureURL is a different URL and i get the exception.
Picasso.with(ma).load(ma.OwnerProfilePictureURL).resize(witdthHeight, witdthHeight).centerCrop().into(userProfileImage);
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:714)
at com.pkmmte.view.CircularImageView.refreshBitmapShader(CircularImageView.java:341)
at com.pkmmte.view.CircularImageView.invalidate(CircularImageView.java:262)
at android.widget.ImageView.setImageDrawable(ImageView.java:467)
at com.squareup.picasso.PicassoDrawable.setPlaceholder(PicassoDrawable.java:61)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:664)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:601)
at com.belvia.pyp.UI.MainActivity$9.onPostExecute(MainActivity.java:681)
at com.belvia.pyp.UI.MainActivity$9.onPostExecute(MainActivity.java:668)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5944)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
hey man ,what if i want add padding,, or make the image size smaller but it should be on the center of the view like now,what should i do ?
The following causes a stackoverflow:
BitmapDrawable drawable = new BitmapDrawable(getResources(), response.getBitmap());
TransitionDrawable transition = new TransitionDrawable(new Drawable[]{drawable, getResources().getDrawable(R.drawable.standardimage)});
transition.setCrossFadeEnabled(true);
setImageDrawable(transition);
transition.startTransition(1000);
I suspect the reason is your conversion to Bitmaps, is this really needed? Would getIntrinsicWidth/height not be sufficient?
Is it support the downloaded image from network using Universal Image Loader ? I am getting error when try to set image downloaded from network using UIL .
In combination with the google play services version 6.1.71 I get this error when I add your library as a dependency with gradle.
it seems that the width of CircularImageVIew is auto set to Toolbar width
When setting width or height in xml to wrap_content the CircularImageView fills the space regardless
after set an image programmatically, you can't set another image...
I'm using setImageBitmap
Hi, I don't arrive to change the color of my image with setColorFilter
This is my code
CircularImageView civ = (CircularImageView) rowView.findViewById(R.id.civ);
ImageView iv = (ImageView) rowView.findViewById(R.id.iv);
civ.setImageResource(R.drawable.ic_menu);
iv.setImageResource(R.drawable.ic_menu);
civ.setColorFilter(getResources().getColor(R.color.vivid_green), PorterDuff.Mode.MULTIPLY);
iv.setColorFilter(getResources().getColor(R.color.vivid_green), PorterDuff.Mode.MULTIPLY);
Work on imageview but not on CircularImageView.
I have try with
Drawable d = getResources().getDrawable(R.drawable.ic_menu);
d.setColorFilter(viewHolder.root.getResources().getColor(R.color.vivid_green), PorterDuff.Mode.MULTIPLY);
But it's not working too
Thanks for your work on this library
MIN_SDK_VERSION=14
seems too high and obviates any need for control:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
inside private void applyShadow()
I have tested and it works on the emulator from version 9 APIs. Lower levels were not tested
I can't set a bitmap received from the camera intent to the imageview reliably. There is nothing wrong with the bitmap, but when I try to set it to the imageview, nothing is rendered. Or sporadically something is rendered the first time a bitmap is received, but never replaced. Any ideas?
app:shadow="false" will not load the image in 4.0.4 minSdkVersion 14!
if I change
app:shadow="false" will load the image in 4.0.4 minSdkVersion 14!
<com.pkmmte.view.CircularImageView
android:id="@+id/userPhoto"
android:layout_width="@dimen/userPhoto_layout_width"
android:layout_height="@dimen/userPhoto_layout_height"
app:border="false"
app:border_color="@color/custom_green"
app:border_width="2dp"
app:shadow="true"/>
I just used this CircularImageView in in https://github.com/rudsonlive/NavigationDrawer-MaterialDesign but when I set app:shadow="false" it's not loading the image nad border !!
Hi
How can i use this in eclipse ? I am not using maven.I need the jar file.
When i put any image dynamically or simply the images gets squeezed instead of coming properly as cropped. I think it's a bug you need to work on.
Not circular image cropped for circularImgView.setImageResource() programmatically loaded.
The image is not cropped
When i create the CircularImageView programatically, The Shadow and the border is missing,
Here is my code, What am missing ?
CircularImageView civProfilePic = new CircularImageView(this);
civProfilePic.setBorderColor(getResources().getColor(R.color.mycolor));
civProfilePic.setBorderWidth(3);
civProfilePic.setImageResource(R.drawable.user);
civProfilePic.addShadow();
When clearing the current image using setImageBitmap(null) a nullpointer exception occurs:
java.lang.NullPointerException:
Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:591)
at com.pkmmte.view.CircularImageView.refreshBitmapShader(CircularImageView.java:341)
at com.pkmmte.view.CircularImageView.invalidate(CircularImageView.java:262)
at android.widget.ImageView.setImageDrawable(ImageView.java:456)
at android.widget.ImageView.setImageBitmap(ImageView.java:548)
This should not happen, the default ImageView doesn't do this.
shows circular image with black box behind
android.widget.ImageView.invalidateDrawable (ImageView.java:190)
android.graphics.drawable.Drawable.invalidateSelf (Drawable.java:338)
com.koushikdutta.ion.IonDrawable.draw (IonDrawable.java:688)
com.pkmmte.view.CircularImageView.drawableToBitmap (CircularImageView.java:331)
com.pkmmte.view.CircularImageView.invalidate (CircularImageView.java:260)
android.widget.ImageView.invalidateDrawable (ImageView.java:190)
java.lang.NullPointerException at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:597) at com.pkmmte.view.CircularImageView.refreshBitmapShader(CircularImageView.java:341) at com.pkmmte.view.CircularImageView.invalidate(CircularImageView.java:262) at android.widget.ImageView.setImageDrawable(ImageView.java:426) at com.squareup.picasso.PicassoDrawable.setPlaceholder(PicassoDrawable.java:61) at com.squareup.picasso.RequestCreator.into(RequestCreator.java:664) at com.squareup.picasso.RequestCreator.into(RequestCreator.java:601) at com.king.s2m.ui.activityUtil.OwnProfileController.showUserProfileData(OwnProfileController.java:115) at com.king.s2m.ui.activityUtil.OwnProfileController$2.success(OwnProfileController.java:344) at com.king.s2m.api.Callback.success(Callback.java:14) at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193)
Using it through gradle I have to use the same targetSdkVersion, is this actually necessary?
Can you please getting this resolved ?
http://stackoverflow.com/questions/31049273/clearing-image-in-circularimageview-does-not-work
this one, for example ( resolution : 1960x1307 inside drawable-xxhdpi) :
http://dreamatico.com/data_images/people/people-2.jpg
No works or Java code or XML code
Being able to apply a ColorFilter to images can be important at times.
Since I currently rely on a custom ColorFilter for the selector overlay, I'll have to change the draw it's drawn and use another paint object for it instead.
Should this just be as easy as import->module? (Android Dev Studio 0.8.2)
Everything in the build.gradle file is unknown (project.VERSION_NAME etc).
Error:(3, 0) Could not find property 'VERSION_NAME' on project ':circularimageview'.
Has an issue with android:scaleType="center"
Recently as I used the circularimageview, specifically in a ListView, my app crashes out of OutOfMemoryError. This is the exception log:
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Bitmap.java)
at android.graphics.Bitmap.createBitmap(Bitmap.java:809)
at android.graphics.Bitmap.createBitmap(Bitmap.java:786)
at android.graphics.Bitmap.createBitmap(Bitmap.java:718)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:594)
at com.pkmmte.view.CircularImageView.refreshBitmapShader(CircularImageView.java:393)
at com.pkmmte.view.CircularImageView.onDraw(CircularImageView.java:208)
at android.view.View.draw(View.java:14740)
at android.view.View.buildDrawingCache(View.java:13953)
at android.view.View.getDisplayList(View.java:13612)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.getDisplayList(View.java:13631)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.widget.ListView.drawChild(ListView.java:3363)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.widget.AbsListView.dispatchDraw(AbsListView.java:2503)
at android.widget.ListView.dispatchDraw(ListView.java:3358)
at android.view.View.draw(View.java:14743)
at android.widget.AbsListView.draw(AbsListView.java:4039)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:1060)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.getDisplayList(View.java:13631)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.support.v7.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:509)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.getDisplayList(View.java:13631)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.getDisplayList(View.java:13631)
at android.view.View.getDisplayList(View.java:13678)
at android.view.View.draw(View.java:14457)
at android.view.ViewGroup.drawChild(ViewGroup.java:3117)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954)
at android.view.View.draw(View.java:14743)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2329)
at android.view.View.getDisplayList(View.java:13636)
at android.view.View.getDisplayList(View.java:13678)
at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1570)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2401)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2273)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1903)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1020)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5762)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:771)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:757)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(NativeStart.java)
The lines of code:
final CircularImageView circularImageView = (CircularImageView) holder.mRootView.findViewById(R.id.circularImageView);
Picasso.with(holder.mRootView.getContext()).load(new File(trackingNumbers.get(position).getImageUrl())).error(R.drawable.no_image_place_holder).noFade().into(circularImageView);
The exception:
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:596)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.pkmmte.view.CircularImageView.refreshBitmapShader(CircularImageView.java:341)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.pkmmte.view.CircularImageView.invalidate(CircularImageView.java:262)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.widget.ImageView.setImageDrawable(ImageView.java:456)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.squareup.picasso.PicassoDrawable.setPlaceholder(PicassoDrawable.java:61)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.squareup.picasso.RequestCreator.into(RequestCreator.java:664)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.squareup.picasso.RequestCreator.into(RequestCreator.java:601)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at kael.trackninja.Adapters.TrackingRecyclerViewAdapter.onBindViewHolder(TrackingRecyclerViewAdapter.java:83)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at kael.trackninja.Adapters.TrackingRecyclerViewAdapter.onBindViewHolder(TrackingRecyclerViewAdapter.java:30)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5212)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5245)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4483)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4359)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1435)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView.access$400(RecyclerView.java:144)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:282)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:580)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:549)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5272)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
11-07 16:16:46.246 29353-29353/kael.trackninja E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
It happens only when using CircleImageView, when switching to regualr ImageView its not working.
EDIT: I found that when you adding "placeholder" to picasso its working fine:
Picasso.with(holder.mRootView.getContext()).load(new File(trackingNumbers.get(position).getImageUrl())).error(R.drawable.no_image_place_holder).noFade().placeholder(R.drawable.no_image_place_holder).into(circularImageView);
I'm getting a NullPointerException at createScaledBitmap when I'm scrolling down in my ListView to a certain item. I'm using Picasso, this is my code to set the image into the CircularImageDrawable:
Picasso.with(activity).load(artist.getImage()).into(image);
You should add android:minSdkVersion information in project usage. If i use app:shadow="true" attribute , project must be API 11 and above. Because function setLayerType in addShadow
function is only available on API 11
The hasBorder attribute can't be set programatically. It would be great to be able to enable/disable it in code.
Applying a ColorDrawable as in imageView.setDrawable() or .setResource() results in a crash.
A workaround would be to transform it into a Bitmap then apply it. An elegant fix is required.
http://stackoverflow.com/questions/25753452/circularimageview-with-a-solid-color
CircularImageView does not react on gravity parameters inside LinearLayout or RelativeLayout. It always anchors to top left corner. Built under Android 6.0
When I use a transparent image then the border is not has a fix size.
There seems to be no way to customize the shadow parameters (radius, dx, dy, color), and the default color is too dark (#999999 would probably be a better default).
I am trying to import the gradle import to download the library but doesn't work
is it disabled?
I now can't get CircularImageView to work with Ion(https://github.com/koush/ion). Can you take a look and add support to it?
setLayerType in android 2.3,not use,how to use this in android2.3
As it shows here https://bintray.com/bintray/jcenter/com.pkmmte.view%3Acircularimageview/1.1/view#files, the aar file is 12 months old and when I decompiled the class in Android Studio, I get old stuff.
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.pkmmte.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View.MeasureSpec;
import android.widget.ImageView;
import com.pkmmte.view.R.attr;
import com.pkmmte.view.R.styleable;
public class CircularImageView extends ImageView {
private boolean hasBorder;
private boolean hasSelector;
private boolean isSelected;
private int borderWidth;
private int canvasSize;
private int selectorStrokeWidth;
private BitmapShader shader;
private Bitmap image;
private Paint paint;
private Paint paintBorder;
private Paint paintSelectorBorder;
private ColorFilter selectorFilter;
public CircularImageView(Context context) {
this(context, (AttributeSet)null);
}
public CircularImageView(Context context, AttributeSet attrs) {
this(context, attrs, attr.circularImageViewStyle);
}
public CircularImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
this.paint = new Paint();
this.paint.setAntiAlias(true);
this.paintBorder = new Paint();
this.paintBorder.setAntiAlias(true);
this.paintSelectorBorder = new Paint();
this.paintSelectorBorder.setAntiAlias(true);
TypedArray attributes = context.obtainStyledAttributes(attrs, styleable.CircularImageView, defStyle, 0);
this.hasBorder = attributes.getBoolean(0, false);
this.hasSelector = attributes.getBoolean(3, false);
int defaultSelectorSize;
if(this.hasBorder) {
defaultSelectorSize = (int)(2.0F * context.getResources().getDisplayMetrics().density + 0.5F);
this.setBorderWidth(attributes.getDimensionPixelOffset(2, defaultSelectorSize));
this.setBorderColor(attributes.getColor(1, -1));
}
if(this.hasSelector) {
defaultSelectorSize = (int)(2.0F * context.getResources().getDisplayMetrics().density + 0.5F);
this.setSelectorColor(attributes.getColor(4, 0));
this.setSelectorStrokeWidth(attributes.getDimensionPixelOffset(6, defaultSelectorSize));
this.setSelectorStrokeColor(attributes.getColor(5, -16776961));
}
if(attributes.getBoolean(7, false)) {
this.addShadow();
}
attributes.recycle();
}
public void setBorderWidth(int borderWidth) {
this.borderWidth = borderWidth;
this.requestLayout();
this.invalidate();
}
public void setBorderColor(int borderColor) {
if(this.paintBorder != null) {
this.paintBorder.setColor(borderColor);
}
this.invalidate();
}
public void setSelectorColor(int selectorColor) {
this.selectorFilter = new PorterDuffColorFilter(selectorColor, Mode.SRC_ATOP);
this.invalidate();
}
public void setSelectorStrokeWidth(int selectorStrokeWidth) {
this.selectorStrokeWidth = selectorStrokeWidth;
this.requestLayout();
this.invalidate();
}
public void setSelectorStrokeColor(int selectorStrokeColor) {
if(this.paintSelectorBorder != null) {
this.paintSelectorBorder.setColor(selectorStrokeColor);
}
this.invalidate();
}
public void addShadow() {
this.setLayerType(1, this.paintBorder);
this.paintBorder.setShadowLayer(4.0F, 0.0F, 2.0F, -16777216);
}
public void onDraw(Canvas canvas) {
if(this.image != null) {
if(this.image.getHeight() != 0 && this.image.getWidth() != 0) {
int oldCanvasSize = this.canvasSize;
this.canvasSize = canvas.getWidth();
if(canvas.getHeight() < this.canvasSize) {
this.canvasSize = canvas.getHeight();
}
if(oldCanvasSize != this.canvasSize) {
this.refreshBitmapShader();
}
this.paint.setShader(this.shader);
int outerWidth = 0;
int center = this.canvasSize / 2;
if(this.hasSelector && this.isSelected) {
outerWidth = this.selectorStrokeWidth;
center = (this.canvasSize - outerWidth * 2) / 2;
this.paint.setColorFilter(this.selectorFilter);
canvas.drawCircle((float)(center + outerWidth), (float)(center + outerWidth), (float)((this.canvasSize - outerWidth * 2) / 2 + outerWidth) - 4.0F, this.paintSelectorBorder);
} else if(this.hasBorder) {
outerWidth = this.borderWidth;
center = (this.canvasSize - outerWidth * 2) / 2;
this.paint.setColorFilter((ColorFilter)null);
canvas.drawCircle((float)(center + outerWidth), (float)(center + outerWidth), (float)((this.canvasSize - outerWidth * 2) / 2 + outerWidth) - 4.0F, this.paintBorder);
} else {
this.paint.setColorFilter((ColorFilter)null);
}
canvas.drawCircle((float)(center + outerWidth), (float)(center + outerWidth), (float)((this.canvasSize - outerWidth * 2) / 2) - 4.0F, this.paint);
}
}
}
public boolean dispatchTouchEvent(MotionEvent event) {
if(!this.isClickable()) {
this.isSelected = false;
return super.onTouchEvent(event);
} else {
switch(event.getAction()) {
case 0:
this.isSelected = true;
break;
case 1:
case 3:
case 4:
case 8:
this.isSelected = false;
case 2:
case 5:
case 6:
case 7:
}
this.invalidate();
return super.dispatchTouchEvent(event);
}
}
public void invalidate(Rect dirty) {
super.invalidate(dirty);
this.image = this.drawableToBitmap(this.getDrawable());
if(this.shader != null || this.canvasSize > 0) {
this.refreshBitmapShader();
}
}
public void invalidate(int l, int t, int r, int b) {
super.invalidate(l, t, r, b);
this.image = this.drawableToBitmap(this.getDrawable());
if(this.shader != null || this.canvasSize > 0) {
this.refreshBitmapShader();
}
}
public void invalidate() {
super.invalidate();
this.image = this.drawableToBitmap(this.getDrawable());
if(this.shader != null || this.canvasSize > 0) {
this.refreshBitmapShader();
}
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = this.measureWidth(widthMeasureSpec);
int height = this.measureHeight(heightMeasureSpec);
this.setMeasuredDimension(width, height);
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result;
if(specMode == 1073741824) {
result = specSize;
} else if(specMode == -2147483648) {
result = specSize;
} else {
result = this.canvasSize;
}
return result;
}
private int measureHeight(int measureSpecHeight) {
boolean result = false;
int specMode = MeasureSpec.getMode(measureSpecHeight);
int specSize = MeasureSpec.getSize(measureSpecHeight);
int result1;
if(specMode == 1073741824) {
result1 = specSize;
} else if(specMode == -2147483648) {
result1 = specSize;
} else {
result1 = this.canvasSize;
}
return result1 + 2;
}
public Bitmap drawableToBitmap(Drawable drawable) {
if(drawable == null) {
return null;
} else if(drawable instanceof BitmapDrawable) {
return ((BitmapDrawable)drawable).getBitmap();
} else {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
public void refreshBitmapShader() {
this.shader = new BitmapShader(Bitmap.createScaledBitmap(this.image, this.canvasSize, this.canvasSize, false), TileMode.CLAMP, TileMode.CLAMP);
}
public boolean isSelected() {
return this.isSelected;
}
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.