How to make an ImageView with rounded corners?

前端 未结 30 2602
天涯浪人
天涯浪人 2020-11-21 05:39

In Android, an ImageView is a rectangle by default. How can I make it a rounded rectangle (clip off all 4 corners of my Bitmap to be rounded rectangles) in the ImageView?

30条回答
  •  闹比i
    闹比i (楼主)
    2020-11-21 06:22

    The following creates a rounded rectangle layout object that draws a rounded rectangle around any child objects that are placed in it. It also demonstrates how to create views and layouts programmatically without using the layout xml files.

    package android.example;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.util.TypedValue;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class MessageScreen extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      int mainBackgroundColor = Color.parseColor("#2E8B57");
      int labelTextColor = Color.parseColor("#FF4500");
      int messageBackgroundColor = Color.parseColor("#3300FF");
      int messageTextColor = Color.parseColor("#FFFF00");
    
      DisplayMetrics metrics = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metrics);
      float density = metrics.density;
      int minMarginSize = Math.round(density * 8);
      int paddingSize = minMarginSize * 2;
      int maxMarginSize = minMarginSize * 4;
    
      TextView label = new TextView(this);
      /*
       * The LayoutParams are instructions to the Layout that will contain the
       * View for laying out the View, so you need to use the LayoutParams of
       * the Layout that will contain the View.
       */
      LinearLayout.LayoutParams labelLayoutParams = new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      label.setLayoutParams(labelLayoutParams);
      label.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
      label.setPadding(paddingSize, paddingSize, paddingSize, paddingSize);
      label.setText(R.string.title);
      label.setTextColor(labelTextColor);
    
      TextView message = new TextView(this);
      RoundedRectangle.LayoutParams messageLayoutParams = new RoundedRectangle.LayoutParams(
     LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
      /*
       * This is one of the calls must made to force a ViewGroup to call its
       * draw method instead of just calling the draw method of its children.
       * This tells the RoundedRectangle to put some extra space around the
       * View.
       */
      messageLayoutParams.setMargins(minMarginSize, paddingSize,
        minMarginSize, maxMarginSize);
      message.setLayoutParams(messageLayoutParams);
      message.setTextSize(TypedValue.COMPLEX_UNIT_SP, paddingSize);
      message.setText(R.string.message);
      message.setTextColor(messageTextColor);
      message.setBackgroundColor(messageBackgroundColor);
    
      RoundedRectangle messageContainer = new RoundedRectangle(this);
      LinearLayout.LayoutParams messageContainerLayoutParams = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
      messageContainerLayoutParams.setMargins(paddingSize, 0, paddingSize, 0);
      messageContainer.setLayoutParams(messageContainerLayoutParams);
      messageContainer.setOrientation(LinearLayout.VERTICAL);
      /*
       * This is one of the calls must made to force a ViewGroup to call its
       * draw method instead of just calling the draw method of its children.
       * This tells the RoundedRectangle to color the the exta space that was
       * put around the View as well as the View. This is exterior color of
       * the RoundedRectangle.
       */
      messageContainer.setBackgroundColor(mainBackgroundColor);
      /*
       * This is one of the calls must made to force a ViewGroup to call its
       * draw method instead of just calling the draw method of its children.
       * This is the interior color of the RoundedRectangle. It must be
       * different than the exterior color of the RoundedRectangle or the
       * RoundedRectangle will not call its draw method.
       */
      messageContainer.setInteriorColor(messageBackgroundColor);
      // Add the message to the RoundedRectangle.
      messageContainer.addView(message);
    
      //
      LinearLayout main = new LinearLayout(this);
      LinearLayout.LayoutParams mainLayoutParams = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
      main.setLayoutParams(mainLayoutParams);
      main.setOrientation(LinearLayout.VERTICAL);
      main.setBackgroundColor(mainBackgroundColor);
      main.addView(label);
      main.addView(messageContainer);
    
      setContentView(main);
     }
    }
    

    The class for RoundedRectangle layout object is as defined here:

    /**
     *  A LinearLayout that draws a rounded rectangle around the child View that was added to it.
     */
    package android.example;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    import android.util.DisplayMetrics;
    import android.widget.LinearLayout;
    
    /**
     * A LinearLayout that has rounded corners instead of square corners.
     * 
     * @author Danny Remington
     * 
     * @see LinearLayout
     * 
     */
    public class RoundedRectangle extends LinearLayout {
     private int mInteriorColor;
    
     public RoundedRectangle(Context p_context) {
      super(p_context);
     }
    
     public RoundedRectangle(Context p_context, AttributeSet attributeSet) {
      super(p_context, attributeSet);
     }
    
     // Listener for the onDraw event that occurs when the Layout is drawn.
     protected void onDraw(Canvas canvas) {
      Rect rect = new Rect(0, 0, getWidth(), getHeight());
      RectF rectF = new RectF(rect);
      DisplayMetrics metrics = new DisplayMetrics();
      Activity activity = (Activity) getContext();
      activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
      float density = metrics.density;
      int arcSize = Math.round(density * 10);
    
      Paint paint = new Paint();
      paint.setColor(mInteriorColor);
    
      canvas.drawRoundRect(rectF, arcSize, arcSize, paint);
     }
    
     /**
      * Set the background color to use inside the RoundedRectangle.
      * 
      * @param Primitive int - The color inside the rounded rectangle.
      */
     public void setInteriorColor(int interiorColor) {
      mInteriorColor = interiorColor;
     }
    
     /**
      * Get the background color used inside the RoundedRectangle.
      * 
      * @return Primitive int - The color inside the rounded rectangle.
      */
     public int getInteriorColor() {
      return mInteriorColor;
     }
    
    }
    

提交回复
热议问题