Java 试图修复我的代码,但我一直失败:(

Java 试图修复我的代码,但我一直失败:(,java,android,listview,imageview,Java,Android,Listview,Imageview,我有一个代码,它使用一个列表视图将图像变成一个圆圈。但是如图中所示,当它到达照片的末尾时,它就消失了(最后几个像素是在不应该出现的情况下进行的) 我不希望照片占据整个页面,只希望照片的大小。以下是代码和XML: 流项目xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l

我有一个代码,它使用一个
列表视图将图像变成一个圆圈。但是如图中所示,当它到达照片的末尾时,它就消失了(最后几个像素是在不应该出现的情况下进行的)

我不希望照片占据整个页面,只希望照片的大小。以下是代码和XML:

流项目xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

</RelativeLayout>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_list"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="0px"
    android:drawSelectorOnTop="true"
    tools:context=".StreamActivity" />
public class StreamActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_stream);

        StreamAdapter adapter = new StreamAdapter(this);
        ((ListView) findViewById(R.id.main_list)).setAdapter(adapter);

        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));

    }

    class StreamItem {
        final Bitmap mBitmap;


        StreamItem(Context c, int resid, String line1, String line2) {
            mBitmap = BitmapFactory.decodeResource(c.getResources(), resid);

        }
    }

    class StreamDrawable extends Drawable {
        private static final boolean USE_VIGNETTE = true;

        private final float mCornerRadius;
        private final RectF mRect = new RectF();
        private final BitmapShader mBitmapShader;
        private final Paint mPaint;
        private final int mMargin;

        StreamDrawable(Bitmap bitmap, float cornerRadius, int margin) {
            mCornerRadius = cornerRadius;

            mBitmapShader = new BitmapShader(bitmap,
                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setShader(mBitmapShader);

            mMargin = margin;
        }

        @Override
        protected void onBoundsChange(Rect bounds) {
            super.onBoundsChange(bounds);
            mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);

            if (USE_VIGNETTE) {
                RadialGradient vignette = new RadialGradient(
                        mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f,
                        new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },
                        Shader.TileMode.CLAMP);

                Matrix oval = new Matrix();
                oval.setScale(1.0f, 0.7f);
                vignette.setLocalMatrix(oval);

                mPaint.setShader(
                        new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER));
            }
        }

        @Override
        public void draw(Canvas canvas) {
            canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
        }

        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }

        @Override
        public void setAlpha(int alpha) {
            mPaint.setAlpha(alpha);
        }

        @Override
        public void setColorFilter(ColorFilter cf) {
            mPaint.setColorFilter(cf);
        }       
    }


    class StreamAdapter extends ArrayAdapter<StreamItem> {
        private static final int CORNER_RADIUS =100; // dips
        private static final int MARGIN = 1; // dips

        private final int mCornerRadius;
        private final int mMargin;
        private final LayoutInflater mInflater;

        public StreamAdapter(Context context) {
            super(context, 0);

            final float density = context.getResources().getDisplayMetrics().density;
            mCornerRadius = (int) (CORNER_RADIUS * density + 0.5f);
            mMargin = (int) (MARGIN * density + 0.5f);

            mInflater = LayoutInflater.from(getContext());
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewGroup view = null;

            if (convertView == null) {
                view = (ViewGroup) mInflater.inflate(R.layout.stream_item, parent, false);
            } else {
                view = (ViewGroup) convertView;
            }

            StreamItem item = getItem(position);

            StreamDrawable d = new StreamDrawable(item.mBitmap, mCornerRadius, mMargin);
            view.setBackgroundDrawable(d);

            int w = item.mBitmap.getWidth();
            int h = item.mBitmap.getHeight();

            float ratio = w / (float) h;

            LayoutParams lp = view.getLayoutParams();
            lp.width = getContext().getResources().getDisplayMetrics().widthPixels;
            lp.height = (int) (lp.width / ratio);

            return view;
        }
    }
}

活动流xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

</RelativeLayout>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_list"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="0px"
    android:drawSelectorOnTop="true"
    tools:context=".StreamActivity" />
public class StreamActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_stream);

        StreamAdapter adapter = new StreamAdapter(this);
        ((ListView) findViewById(R.id.main_list)).setAdapter(adapter);

        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));

    }

    class StreamItem {
        final Bitmap mBitmap;


        StreamItem(Context c, int resid, String line1, String line2) {
            mBitmap = BitmapFactory.decodeResource(c.getResources(), resid);

        }
    }

    class StreamDrawable extends Drawable {
        private static final boolean USE_VIGNETTE = true;

        private final float mCornerRadius;
        private final RectF mRect = new RectF();
        private final BitmapShader mBitmapShader;
        private final Paint mPaint;
        private final int mMargin;

        StreamDrawable(Bitmap bitmap, float cornerRadius, int margin) {
            mCornerRadius = cornerRadius;

            mBitmapShader = new BitmapShader(bitmap,
                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setShader(mBitmapShader);

            mMargin = margin;
        }

        @Override
        protected void onBoundsChange(Rect bounds) {
            super.onBoundsChange(bounds);
            mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);

            if (USE_VIGNETTE) {
                RadialGradient vignette = new RadialGradient(
                        mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f,
                        new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },
                        Shader.TileMode.CLAMP);

                Matrix oval = new Matrix();
                oval.setScale(1.0f, 0.7f);
                vignette.setLocalMatrix(oval);

                mPaint.setShader(
                        new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER));
            }
        }

        @Override
        public void draw(Canvas canvas) {
            canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
        }

        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }

        @Override
        public void setAlpha(int alpha) {
            mPaint.setAlpha(alpha);
        }

        @Override
        public void setColorFilter(ColorFilter cf) {
            mPaint.setColorFilter(cf);
        }       
    }


    class StreamAdapter extends ArrayAdapter<StreamItem> {
        private static final int CORNER_RADIUS =100; // dips
        private static final int MARGIN = 1; // dips

        private final int mCornerRadius;
        private final int mMargin;
        private final LayoutInflater mInflater;

        public StreamAdapter(Context context) {
            super(context, 0);

            final float density = context.getResources().getDisplayMetrics().density;
            mCornerRadius = (int) (CORNER_RADIUS * density + 0.5f);
            mMargin = (int) (MARGIN * density + 0.5f);

            mInflater = LayoutInflater.from(getContext());
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewGroup view = null;

            if (convertView == null) {
                view = (ViewGroup) mInflater.inflate(R.layout.stream_item, parent, false);
            } else {
                view = (ViewGroup) convertView;
            }

            StreamItem item = getItem(position);

            StreamDrawable d = new StreamDrawable(item.mBitmap, mCornerRadius, mMargin);
            view.setBackgroundDrawable(d);

            int w = item.mBitmap.getWidth();
            int h = item.mBitmap.getHeight();

            float ratio = w / (float) h;

            LayoutParams lp = view.getLayoutParams();
            lp.width = getContext().getResources().getDisplayMetrics().widthPixels;
            lp.height = (int) (lp.width / ratio);

            return view;
        }
    }
}

主代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

</RelativeLayout>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_list"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="0px"
    android:drawSelectorOnTop="true"
    tools:context=".StreamActivity" />
public class StreamActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_stream);

        StreamAdapter adapter = new StreamAdapter(this);
        ((ListView) findViewById(R.id.main_list)).setAdapter(adapter);

        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));
        adapter.add(new StreamItem(this, R.drawable.testimage1, null, null));

    }

    class StreamItem {
        final Bitmap mBitmap;


        StreamItem(Context c, int resid, String line1, String line2) {
            mBitmap = BitmapFactory.decodeResource(c.getResources(), resid);

        }
    }

    class StreamDrawable extends Drawable {
        private static final boolean USE_VIGNETTE = true;

        private final float mCornerRadius;
        private final RectF mRect = new RectF();
        private final BitmapShader mBitmapShader;
        private final Paint mPaint;
        private final int mMargin;

        StreamDrawable(Bitmap bitmap, float cornerRadius, int margin) {
            mCornerRadius = cornerRadius;

            mBitmapShader = new BitmapShader(bitmap,
                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setShader(mBitmapShader);

            mMargin = margin;
        }

        @Override
        protected void onBoundsChange(Rect bounds) {
            super.onBoundsChange(bounds);
            mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);

            if (USE_VIGNETTE) {
                RadialGradient vignette = new RadialGradient(
                        mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f,
                        new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },
                        Shader.TileMode.CLAMP);

                Matrix oval = new Matrix();
                oval.setScale(1.0f, 0.7f);
                vignette.setLocalMatrix(oval);

                mPaint.setShader(
                        new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER));
            }
        }

        @Override
        public void draw(Canvas canvas) {
            canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
        }

        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }

        @Override
        public void setAlpha(int alpha) {
            mPaint.setAlpha(alpha);
        }

        @Override
        public void setColorFilter(ColorFilter cf) {
            mPaint.setColorFilter(cf);
        }       
    }


    class StreamAdapter extends ArrayAdapter<StreamItem> {
        private static final int CORNER_RADIUS =100; // dips
        private static final int MARGIN = 1; // dips

        private final int mCornerRadius;
        private final int mMargin;
        private final LayoutInflater mInflater;

        public StreamAdapter(Context context) {
            super(context, 0);

            final float density = context.getResources().getDisplayMetrics().density;
            mCornerRadius = (int) (CORNER_RADIUS * density + 0.5f);
            mMargin = (int) (MARGIN * density + 0.5f);

            mInflater = LayoutInflater.from(getContext());
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewGroup view = null;

            if (convertView == null) {
                view = (ViewGroup) mInflater.inflate(R.layout.stream_item, parent, false);
            } else {
                view = (ViewGroup) convertView;
            }

            StreamItem item = getItem(position);

            StreamDrawable d = new StreamDrawable(item.mBitmap, mCornerRadius, mMargin);
            view.setBackgroundDrawable(d);

            int w = item.mBitmap.getWidth();
            int h = item.mBitmap.getHeight();

            float ratio = w / (float) h;

            LayoutParams lp = view.getLayoutParams();
            lp.width = getContext().getResources().getDisplayMetrics().widthPixels;
            lp.height = (int) (lp.width / ratio);

            return view;
        }
    }
}
公共类StreamActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_流);
StreamAdapter=新的StreamAdapter(此);
((ListView)findViewById(R.id.main_list)).setAdapter(adapter);
add(新的StreamItem(this,R.drawable.testimage1,null,null));
add(新的StreamItem(this,R.drawable.testimage1,null,null));
add(新的StreamItem(this,R.drawable.testimage1,null,null));
add(新的StreamItem(this,R.drawable.testimage1,null,null));
}
类流项目{
最终位图mBitmap;
StreamItem(上下文c、整数剩余、字符串行1、字符串行2){
mBitmap=BitmapFactory.decodeResource(c.getResources(),resid);
}
}
类StreamDrawable扩展了Drawable{
私有静态最终布尔用法\u VIGNETTE=true;
私人最终浮动mCornerRadius;
private final RectF mRect=new RectF();
专用最终位图着色器mBitmapShader;
私人最终油漆;
私人终审法院;
StreamDrawable(位图、浮点角半径、整型边距){
mCornerRadius=转弯半径;
mBitmapShader=新的位图着色器(位图,
Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
mPaint=新油漆();
mPaint.setAntiAlias(true);
mPaint.setShader(mBitmapShader);
M边缘=边缘;
}
@凌驾
受保护的void onBoundsChange(矩形边界){
super.onBoundsChange(边界);
mRect.set(mMargin,mMargin,bounds.width()-mMargin,bounds.height()-mMargin);
如果(使用_渐晕图){
RadialGradient渐晕=新的RadialGradient(
mRect.centerX(),mRect.centerY()*1.0f/0.7f,mRect.centerX()*1.3f,
新的int[]{0,0,0x7f000000},新的float[]{0.0f,0.7f,1.0f},
Shader.TileMode.CLAMP);
矩阵椭圆=新矩阵();
椭圆形刻度盘(1.0f,0.7f);
vignette.setLocalMatrix(椭圆形);
mPaint.setShader(
新的复合阴影器(mBitmapShader、vignette、PorterDuff.Mode.SRC_OVER));
}
}
@凌驾
公共空白绘制(画布){
canvas.drawRoundRect(mRect、mCornerRadius、mCornerRadius、mPaint);
}
@凌驾
公共int getOpacity(){
返回像素格式。半透明;
}
@凌驾
公共void setAlpha(int-alpha){
mPaint.setAlpha(alpha);
}
@凌驾
公共无效设置ColorFilter(ColorFilter cf){
mPaint.setColorFilter(cf);
}       
}
类StreamAdapter扩展了ArrayAdapter{
私有静态最终int角半径=100;//倾角
专用静态最终整型余量=1;//下陷
私人最终int mCornerRadius;
私人终审法院;
私人最终布局平面图;
公共流适配器(上下文){
超级(上下文,0);
最终浮点密度=context.getResources().getDisplayMetrics().density;
mCornerRadius=(int)(角半径*密度+0.5f);
M边缘=(内部)(边缘*密度+0.5f);
mInflater=LayoutInflater.from(getContext());
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewGroup view=null;
if(convertView==null){
视图=(视图组)最小平面。充气(R.layout.stream\u项,父项,false);
}否则{
视图=(视图组)转换视图;
}
StreamItem item=getItem(位置);
可提取流量d=新的可提取流量(item.mBitmap,mCornerRadius,mMargin);
视图。可缩进地面绘制(d);
int w=item.mBitmap.getWidth();
inth=item.mBitmap.getHeight();
浮动比率=w/(浮动)h;
LayoutParams lp=view.getLayoutParams();
lp.width=getContext().getResources().getDisplayMetrics().widthPixels;
lp.高度=(int)(lp.宽度/比率);
返回视图;
}
}
}