android - 自定义圆形imageView获取错误膨胀

时间:2015-03-23 05:41:36

标签: android android-listview android-imageview

我是一个列表视图,我使用自定义布局来制作行。在每一行中,我都使用自定义imageView来舍入图像。这是班级:

public class RoundedImageView extends ImageView {

public RoundedImageView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public RoundedImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public RoundedImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onDraw(Canvas canvas) {

    Drawable drawable = getDrawable();

    if (drawable == null) {
        return;
    }

    if (getWidth() == 0 || getHeight() == 0) {
        return;
    }
    Bitmap b = ((BitmapDrawable) drawable).getBitmap();
    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

    int w = getWidth(), h = getHeight();

    Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
    canvas.drawBitmap(roundBitmap, 0, 0, null);

}

public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
    Bitmap sbmp;
    if (bmp.getWidth() != radius || bmp.getHeight() != radius)
        sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
    else
        sbmp = bmp;
    Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
            Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int color = 0xffa19774;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());

    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setDither(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(Color.parseColor("#BAB399"));
    canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,
            sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(sbmp, rect, rect, paint);

    return output;
}

}

如果上述代码没有在适配器中使用,则可以正常工作。

这是我的适配器代码:

public class ListAdapter extends BaseAdapter {
    Activity activity;
    public ArrayList<HashMap<String,String>> list;

    public ListAdapter(Activity activity, ArrayList<HashMap<String, String>>list ) {
        super();
        this.activity=(Activity)activity;
        this.list=list;
    }

    public int getCount() {
        return contactList.size();
    }

    public Object getItem(int position) {
        return contactList.get(position);
    }

    public long getItemId(int arg0) {
        return 0;
    }

    private class ViewHolder {
        ImageView imguser; 
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        LayoutInflater inflater = activity.getLayoutInflater();
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.ads, null);
            holder = new ViewHolder();
            holder.imguser=(ImageView)convertView.findViewById(R.id.imguser);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        HashMap<String, String> item = contactList.get(position);
        imageLoader.displayImage("http://192.168.1.35/test/usersPic/"+item.get("profileImg"), holder.imguser,
                options, imageListener);

        return convertView;
    }
}

这是我得到的错误:

    03-23 05:30:02.853: E/AndroidRuntime(1533): android.view.InflateException: Binary XML file line #12: Error inflating class com.tejarat.example.RoundedImageView
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:707)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at com.tejarat.example.Fragment_C$ListAdapter.getView(Fragment_C.java:168)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.AbsListView.obtainView(AbsListView.java:2177)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.ListView.onMeasure(ListView.java:1159)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1451)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:704)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.View.measure(View.java:15848)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.Choreographer.doFrame(Choreographer.java:532)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.os.Handler.handleCallback(Handler.java:730)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.os.Looper.loop(Looper.java:137)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at java.lang.reflect.Method.invokeNative(Native Method)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at java.lang.reflect.Method.invoke(Method.java:525)
03-23 05:30:02.853: E/AndroidRuntime(1533):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:73

你能帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

刷新您的项目,只需检查xml中的自定义roundimageview是否会在您点击它时将其重定向到您的类文件。

答案 1 :(得分:0)

getView()方法中更改行:

holder.imguser=(ImageView)convertView.findViewById(R.id.imguser);

这一个:

holder.imguser=(RoundedImageView)convertView.findViewById(R.id.imguser);

可能存在其他问题,但目前可见这一问题。

答案 2 :(得分:0)

在您的适配器中

请检查传递参数:

imageLoader.displayImage("http://192.168.1.35/test/usersPic/"+item.get("profileImg"), holder.imguser,
                options, imageListener);

选项??

您是否初始化了选项值。 请检查。

答案 3 :(得分:0)

如果你只是使用

mOptions = new DisplayImageOptions.Builder()
                .cacheOnDisc(true)
                .cacheInMemory(true)
                .showImageForEmptyUri(R.drawable.noimage_round)
                .showImageOnFail(R.drawable.noimage_round)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .considerExifParams(true)
                .displayer(new RoundedBitmapDisplayer(context.getResources().getDimensionPixelSize(R.dimen.adapter_main_width)))
                .build();

  mImageLoader.displayImage(searchImage, holder.sThumb, mOptions);

将创建圆形图像