ImageView rounded corners

后端 未结 17 1850
长发绾君心
长发绾君心 2020-11-27 15:33

I wanted image to have rounded corners. I implement this xml code and use this in my image view. but image overlap the shape. I am downloading the image through async task.<

相关标签:
17条回答
  • 2020-11-27 16:29

    Try like this if you need to get rounded image ..

    Your MainActivity.java class

    public class MainActivity extends Activity {
        private static final int REQUEST_CODE = 1;
        private Bitmap bitmap;
        private ImageView imageView;
        Bitmap roundedBitmapImage;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            imageView = (ImageView) findViewById(R.id.result);
    
        }
    
        public void pickImage(View View) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(intent, REQUEST_CODE);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
    
    
                try {
                    // We need to recycle unused bitmaps
                    if (bitmap != null) {
                        bitmap.recycle();
                    }
                    InputStream stream = getContentResolver().openInputStream(
                            data.getData());
                    bitmap = BitmapFactory.decodeStream(stream);
                    stream.close();
    
                   /* Bitmap bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                    Bitmap bitmap2=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    
                    Bitmap resultingImage=Bitmap.createBitmap(320, 480, bitmap1.getConfig());
    
                    Canvas canvas = new Canvas(resultingImage);
    
                    Paint paint = new Paint();
                    paint.setAntiAlias(true);
                    Path path=new Path();
                    path.lineTo(150, 0);
                    path.lineTo(230, 120);
                    path.lineTo(70, 120);
                    path.lineTo(150, 0);
    
                    canvas.drawPath(path, paint);
    
                    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
                    canvas.drawBitmap(bitmap2, 0, 0, paint);*/
    
                   //-------> compositeImageView.setImageBitmap(resultingImage);
    
                    // Use this when to provide any shape to image i.e Fit image to any shape.
                    // under mentioned taking reference from Rounder class. Finally changing image in round shape.
                    // Here we are passing reference  bitmap.
                    roundedBitmapImage = new  Rounder().getRoundedShape(bitmap);
    
                    imageView.setImageBitmap(roundedBitmapImage);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
    

    And your rounder class ..

    /** This class crops image to round shape */

    public class Rounder {
        public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
            int targetWidth = 125;
            int targetHeight = 125;
            Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight,
                    Bitmap.Config.ARGB_8888);
    
            Canvas canvas = new Canvas(targetBitmap);
    
            Path path = new Path();
    
            path.addCircle(((float) targetWidth - 1) / 2,
                    ((float) targetHeight - 1) / 2,
                    (Math.min(((float) targetWidth), ((float) targetHeight)) / 2),
                    Path.Direction.CCW);
    
            canvas.clipPath(path);
    
            Bitmap sourceBitmap = scaleBitmapImage;
    
            canvas.drawBitmap(sourceBitmap, new Rect(0, 0, sourceBitmap.getWidth(),
                    sourceBitmap.getHeight()), new Rect(0, 0, targetWidth,
                    targetHeight), null);
    
            return targetBitmap;
        }
    }
    
    0 讨论(0)
  • 2020-11-27 16:30

    Create a Drawable XML file

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <corners android:radius="8dp" />
           <solid android:color="@android:color/white" />
    <stroke
        android:width="1dp"
        android:color="@color/md_white_1000" />
    

    In your layout you add the drawable as a background on the imageView.

        <ImageView
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:src="@drawable/photo"
            android:background="@drawable/roundcorners"/>
    

    Then you add this line in your Java code.

    ImageView.setClipToOutline(true);
    

    Note: this only works with level 21+

    0 讨论(0)
  • 2020-11-27 16:30

    I use extend ImageView:

    public class RadiusCornerImageView extends android.support.v7.widget.AppCompatImageView {
        private int cornerRadiusDP = 0; // dp
        private int corner_radius_position;
    
        public RadiusCornerImageView(Context context) {
            super(context);
        }
    
        public RadiusCornerImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public RadiusCornerImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.RadiusCornerImageView, 0, 0);
            try {
                cornerRadiusDP = typeArray.getInt(R.styleable.RadiusCornerImageView_corner_radius_dp, 0);
                corner_radius_position = typeArray.getInteger(R.styleable.RadiusCornerImageView_corner_radius_position, 0);
            } finally {
                typeArray.recycle();
            }
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            float radiusPx = AndroidUtil.dpToPx(getContext(), cornerRadiusDP);
            Path clipPath = new Path();
            RectF rect = null;
            if (corner_radius_position == 0) { // all
                // round corners on all 4 angles
                rect = new RectF(0, 0, this.getWidth(), this.getHeight());
            } else if (corner_radius_position == 1) {
                // round corners only on top left and top right
                rect = new RectF(0, 0, this.getWidth(), this.getHeight() + radiusPx);
             } else {
                throw new IllegalArgumentException("Unknown corner_radius_position = " + corner_radius_position);
            }
            clipPath.addRoundRect(rect, radiusPx, radiusPx, Path.Direction.CW);
            canvas.clipPath(clipPath);
            super.onDraw(canvas);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 16:31

    you can do by XML like this way

    <stroke android:width="3dp"
            android:color="#ff000000"/>
    
    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp"/> 
    
    <corners android:radius="30px"/> 
    

    and pragmatically you can create rounded bitmap and set in ImageView.

    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
        bitmap.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
    
    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    final float roundPx = 12;
    
    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
    
    return output;
    }
    

    For Universal lazy loader you can use this wat also.

    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .displayer(new RoundedBitmapDisplayer(25)) // default
            .build();
    
    0 讨论(0)
  • 2020-11-27 16:33

    I use Universal Image loader library to download and round the corners of image, and it worked for me.

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(thisContext)
                // You can pass your own memory cache implementation
               .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
               .build();
    
    DisplayImageOptions options = new DisplayImageOptions.Builder()
                .displayer(new RoundedBitmapDisplayer(10)) //rounded corner bitmap
                .cacheInMemory(true)
                .cacheOnDisc(true)
                .build();
    
    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.init(config);
    imageLoader.displayImage(image_url,image_view, options );
    
    0 讨论(0)
提交回复
热议问题