溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

android如何自定義圓角button效果

發(fā)布時間:2021-09-27 13:54:41 來源:億速云 閱讀:121 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“android如何自定義圓角button效果”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“android如何自定義圓角button效果”這篇文章吧。

主要實(shí)現(xiàn)功能:

  1. 自定義圓角大小  支持設(shè)置leftDrawable,和自定義文字內(nèi)容(文字和img默認(rèn)居中)  支持點(diǎn)擊效果

源碼

RoundRadiusButton.java

/** * author: xujiajia * description: * 1、drawable只有在設(shè)置textString的時候才會生效(居中效果兩個一起測量) */public class RoundRadiusButton extends View { //data private int width = 0; private int height = 0; private int roundRadius = 16; private int bgColor = Color.LTGRAY; private boolean isTouching = false; //img and text private Drawable leftDrawable = null; private int drawableWidth = 20; private int drawableHeight = 20; private int leftDrawablePaddingRight = 0; private String textString; private int textSize = 30; private int textColor = Color.BLACK; //onDraw Paint paint; Path path; RectF rectF; Rect rect; public RoundRadiusButton(Context context, int width, int height) { super(context); this.width = width; this.height = height; this.setLayoutParams(new ViewGroup.LayoutParams(width, height)); this.setClickable(true); } public RoundRadiusButton(Context context, AttributeSet attrs) { super(context, attrs); getDataFromAttrs(context, attrs); this.setClickable(true); } public RoundRadiusButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); getDataFromAttrs(context, attrs); this.setClickable(true); } private void getDataFromAttrs(Context context, AttributeSet attrs) { if (attrs == null) { return; } TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundRadiusButton); roundRadius = ta.getDimensionPixelOffset(R.styleable.RoundRadiusButton_roundRadius, 16); bgColor = ta.getColor(R.styleable.RoundRadiusButton_bgColor, Color.LTGRAY); leftDrawable = ta.getDrawable(R.styleable.RoundRadiusButton_leftDrawable); drawableWidth = ta.getDimensionPixelOffset(R.styleable.RoundRadiusButton_drawableWidth, 0); drawableHeight = ta.getDimensionPixelOffset(R.styleable.RoundRadiusButton_drawableHeight, 0); leftDrawablePaddingRight = ta.getDimensionPixelOffset(R.styleable.RoundRadiusButton_leftDrawablePaddingRight, 0); textString = ta.getString(R.styleable.RoundRadiusButton_textString); textSize = ta.getDimensionPixelOffset(R.styleable.RoundRadiusButton_textSize, 0); textColor = ta.getColor(R.styleable.RoundRadiusButton_textColor, Color.BLACK); ta.recycle(); } public void setRoundRadius(int roundRadius) { this.roundRadius = roundRadius; invalidate(); } public void setBgColor(int bgColor) { this.bgColor = bgColor; invalidate(); } public void setLeftDrawable(Drawable leftDrawable, int drawableWidth, int drawableHeight, int paddingRight) { this.leftDrawable = leftDrawable; this.drawableWidth = drawableWidth; this.drawableHeight = drawableHeight; this.leftDrawablePaddingRight = paddingRight; invalidate(); } public void setTextString(String textString) { this.textString = textString; invalidate(); } public void setTextColor(int textColor) { this.textColor = textColor; invalidate(); } public void setTextSize(int textSize) { this.textSize = textSize; invalidate(); } @Override public boolean onTouchEvent(MotionEvent event) { if (isClickable()) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:  isTouching = true;  invalidate();  break; case MotionEvent.ACTION_UP:  isTouching = false;  invalidate();  break; } } return super.onTouchEvent(event); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (width == 0 || height == 0) { width = getWidth(); height = getHeight(); } if (paint == null) { paint = new Paint(); } if (path == null) { path = new Path(); } if (rectF == null) { rectF = new RectF(); } if (rect == null) { rect = new Rect(); } paint.setColor(bgColor); paint.setAntiAlias(true);//抗鋸齒 paint.setStrokeWidth(0);//線的寬度設(shè)為0,避免畫圓弧的時候部分圓弧與邊界相切 paint.setStyle(Paint.Style.FILL_AND_STROKE); path.setFillType(Path.FillType.WINDING); //左上圓角 path.moveTo(0, roundRadius); rectF.set(0, 0, 2 * roundRadius, 2 * roundRadius); path.addArc(rectF, 180, 90); //上邊 path.lineTo(width - roundRadius, 0); //右上圓角 rectF.set(width - roundRadius * 2, 0, width, roundRadius * 2); path.addArc(rectF, -90, 90); //右邊 path.lineTo(width, height - roundRadius); //右下圓角 rectF.set(width - roundRadius * 2, height - roundRadius * 2, width, height); path.addArc(rectF, 0, 90); //下邊 path.lineTo(roundRadius, height); //左下圓角 rectF.set(0, height - roundRadius * 2, 2 * roundRadius, height); path.addArc(rectF, 90, 90); //左邊 path.lineTo(0, roundRadius); path.close(); canvas.drawPath(path, paint); if (isTouching) { paint.setColor(getContext().getResources().getColor(R.color.black_tran_30)); canvas.drawPath(path, paint); } //填充背景中間空白的部分 path.moveTo(0, roundRadius); path.lineTo(width - roundRadius, 0); path.lineTo(width, height - roundRadius); path.lineTo(roundRadius, height); path.close(); canvas.drawPath(path, paint); if (isTouching) { paint.setColor(getContext().getResources().getColor(R.color.black_tran_30)); canvas.drawPath(path, paint); } //text, drawable兩個一起計(jì)算位置 if (!TextUtils.isEmpty(textString)) { paint.setStrokeWidth(1.5f); paint.setColor(textColor); paint.setTextSize(textSize); rect.setEmpty(); paint.getTextBounds(textString, 0, textString.length(), rect); float leftBitmap = 0; float topBitmap = 0; if (leftDrawable != null) { if (leftDrawable != null) {  leftBitmap = (1.0f * width - drawableWidth - rect.width() - leftDrawablePaddingRight) / 2;  topBitmap = (1.0f * height - drawableHeight) / 2;  leftDrawable.setBounds((int) leftBitmap, (int) topBitmap,  (int) (leftBitmap + drawableWidth),  (int) (topBitmap + drawableHeight));  leftDrawable.draw(canvas); } } float textX = 0; float textY =  1.0f * height / 2 + paint.getTextSize() / 2 - paint.getFontMetrics().descent / 2; if (leftBitmap == 0 && topBitmap == 0) { textX = width / 2 - rect.width() / 2; } else { textX = leftBitmap + drawableWidth + leftDrawablePaddingRight; } canvas.drawText(textString, textX, textY, paint); } }}

MainActivity.java

public class MainActivity extends AppCompatActivity { private LinearLayout llContainer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { llContainer = findViewById(R.id.ll_container); RoundRadiusButton roundRadiusButton = new RoundRadiusButton(this, 500, 200); roundRadiusButton.setBgColor(Color.LTGRAY); roundRadiusButton.setRoundRadius(40); //text roundRadiusButton.setTextString("testtesttest"); roundRadiusButton.setTextColor(Color.WHITE); roundRadiusButton.setTextSize(40); //drawable roundRadiusButton.setLeftDrawable(getResources().getDrawable(R.mipmap.ic_launcher), 60, 60, 80); roundRadiusButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "testest", Toast.LENGTH_LONG).show(); } }); roundRadiusButton.setClickable(false); llContainer.addView(roundRadiusButton); }}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ll_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#868684" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity" > <com.example.newbuttiontest.RoundRadiusButton android:layout_width="300dp" android:layout_height="200dp" app:bgColor="#FFEB3B" app:drawableHeight="18dp" app:drawableWidth="18dp" app:leftDrawable="@mipmap/ic_launcher" app:leftDrawablePaddingRight="5dp" app:roundRadius="30dp" app:textColor="#FF4329" app:textSize="16dip" app:textString="testtesttest" /></LinearLayout>

attrs.xml

<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="RoundRadiusButton"> <attr name="roundRadius" format="dimension" /> <attr name="bgColor" format="color" /> <attr name="leftDrawable" format="reference" /> <attr name="leftDrawablePaddingRight" format="dimension" /> <attr name="drawableWidth" format="dimension" /> <attr name="drawableHeight" format="dimension" /> <attr name="textString" format="string" /> <attr name="textSize" format="dimension" /> <attr name="textColor" format="color" /> </declare-styleable></resources>

colors.xml

<resources> <color name="black_tran_30">#30000000</color></resources>

以上是“android如何自定義圓角button效果”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI