GithubHelp home page GithubHelp logo

pkmmte / circularimageview Goto Github PK

View Code? Open in Web Editor NEW
1.2K 1.2K 237.0 1.89 MB

Custom view for circular images in Android while maintaining the best draw performance

License: MIT License

Java 100.00%

circularimageview's People

Contributors

alvarolb avatar googolmo avatar mrjohannchang avatar pkmmte avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

circularimageview's Issues

Image is stretched up vertically

Hello!

After moving to Android 5.0 API I have an issue with circled image. It's stretched up vertically so it become badly scaled and looks ugly.

Could you please investigate the issue?

Thank you in advance.

screenshot_2015-02-03-17-42-51_

Invalid licensing

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.

java.lang.NullPointerException

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)

padding

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 ?

Strange stretching issue

Hi, I have a strange stretching issue (have a look at image).
How I can fix/prevent this issue?

scr

BR
Dima

doesn't support TransitionDrawable

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?

Problems with Universal Image Loader

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 .

problem used in Toolbar

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

setColorFilter not working

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

minSDK version too high

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

Doesn't support bitmap from camera

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!

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 !!

Border and shadow not working!

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 image using .setImageBitmap(null) a nullpointer exception occurs

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.

Stackoverflow if image is loaded from network

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)

Error while replacing with new image

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)

ColorFilter Support

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.

Import Module Directly, Issues?

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'.

Out of memory

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)

NullPointerException with Picasso when there is no placeholder.

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);

NullPointerException

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);

add android:minSdkVersion information

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

Image gravity does not work

CircularImageView does not react on gravity parameters inside LinearLayout or RelativeLayout. It always anchors to top left corner. Built under Android 6.0

Shadow parameters not customizable

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).

setLayerType

setLayerType in android 2.3,not use,how to use this in android2.3

Rendering Problems: Android Studio 0.8.1 (Beta)

Im getting the following error when i try to edit view the layout. However on the emulator and test device its displaying properly. I also cannot set the app:border, etc properties on the xml.
screen shot 2014-12-05 at 12 17 36 pm

I have: compile 'com.pkmmte.view:circularimageview:1.1' in my gradle file

Bintray has old source

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;
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.