2

我有这段代码可以使用ListView. 但如图所示,当它走到照片的末尾时它会死掉(最后几个像素在不应该的时候进行)。

我不希望照片占据整个页面,只是照片的大小。这是代码和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>

活动流xml:

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

在此处输入图像描述

4

0 回答 0