如何使图像按钮呈圆形并在圆圈内,将显示图像并且图像周围会有边框

How to make an Image button circular and inside the circle,an image will be shown and a border will be there around the image

我一直在寻找如何将图像按钮制作成圆形,并在圆圈内显示图像。但我找不到任何有用的资源。我只有24小时,我的客户会检查。

我的目标是创建图像按钮(黑色圆圈,见下图,里面可以显示图像)。见下图:

这是我的 XML 部分...ImageButton 在两个注释行之间

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/backg"
    android:orientation="vertical"
    android:weightSum="10"
    tools:context="sudhirpradhan.example.com.clientpptapp.mainIconFragment">


    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="0dp"
        android:layout_weight="5" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="4.5">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

<!--here is my imageButton need to be look like a circle and within that circle ,a picture will be shown .............. -->

        <ImageButton
            android:id="@+id/imageButton"
            android:layout_width="0dp"
            android:padding="10dp"
            android:scaleType="fitCenter"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:layout_weight="3"
            android:background="@drawable/roundbutton"
            android:src="@drawable/frontbutton" />
<!-- ..........................................................-->
        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="0dp"
        android:layout_weight="0.5" />

</LinearLayout>

这里是@drawable/roundbuttonxml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:startColor="#50d050"
        android:endColor="#008000"
        android:angle="270"/>
    <stroke android:width="5px"
        android:color="#000000"/>

</shape>

我该如何实施..任何建议,谢谢。

抱歉,由于信誉原因无法发表评论。

试着看看fancy buttons library。 在这里您可以为您的按钮、背景颜色、图像等设置半径。 如果你不能使用第三方库 - 检查库的源代码,它很简单。

新版

根据您的评论,我对您的需求有了更好的了解,因此我将在此处提供(重新编辑)我为您准备的解决方案。

首先我像这样扩展了一个 ImageView:

public class CircleImageView extends AppCompatImageView {


    private int borderColor;
    private float borderWidth;



    public CircleImageView(Context context) {
        super(context);
    }

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

    public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        parseAttributes(attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        Drawable drawable = getDrawable();

        if (drawable == null) {
            return;
        }

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

        int w = getWidth(), h = getHeight();
        int imgRadius = w - 2 * (int)this.borderWidth;

        final Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(this.borderColor);
         canvas.drawCircle(this.getWidth() / 2,
                this.getHeight() / 2,
                this.getWidth() / 2, paint);
        Bitmap roundBitmap = getRoundedCroppedBitmap(bitmap, imgRadius);
        canvas.drawBitmap(roundBitmap, this.borderWidth, this.borderWidth, null);

    }

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

        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, finalBitmap.getWidth(),
                finalBitmap.getHeight());

        paint.setAntiAlias(true);
        paint.setFilterBitmap(true);
        paint.setDither(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(Color.parseColor("#BAB399"));
        canvas.drawCircle(
                finalBitmap.getWidth() / 2,
                finalBitmap.getHeight() / 2,
                finalBitmap.getWidth() / 2,
                paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(finalBitmap, rect, rect, paint);
        return output;
    }


    private void parseAttributes(AttributeSet attrs){
        TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CircleImageView);

        this.borderColor = ta.getColor(R.styleable.CircleImageView_border_color, 0xffffff); // default color white
        this.borderWidth = ta.getDimension(R.styleable.CircleImageView_border_width, 1.0f);
    }

}

然后我们需要为 borderColor 和 borderWidth 设置一些样式化的属性,放在 res/values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CircleImageView">
        <attr name="border_color" format="color" />
        <attr name="border_width" format="dimension" />
    </declare-styleable>
</resources>

然后您可以将它包含在您的布局中 - 它会像:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:weightSum="10"
              tools:context=".MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="0dp"
        android:layout_weight="5" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="4.5">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <!--here is my imageButton need to be look like a circle and within that circle ,a picture will be shown .............. -->

        <com.mucodes.roundbuttonexample.CircleImageView
            android:layout_width="200dp"
            android:layout_height="200dp"
            app:border_color="#ffff0000"
            app:border_width="7dp"
            android:src="@drawable/random"/>

        <!-- ..........................................................-->



        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="0dp"
        android:layout_weight="0.5" />

</LinearLayout>

然后您可以使用方法 setOnClickListener 使 CircleImageView 在被点击时像一个按钮一样。

这是结果的视频:example of using

希望现在这就是您所需要的。