android 自定义圆角button效果的实例代码(自定义view Demo)

android 自定义圆角button效果的实例代码(自定义view Demo),第1张

概述android 自定义圆角button效果的实例代码(自定义view Demo) 概述 在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等. 针对这样的场景,直接使用创建多个shape,定义多个xml文件也是可以实现的.但是如果使用非常频繁,那么直接自定义一个就会来的非常方便. 甚至在一些情况下,不是可以用shape定义的规则图形,比如需要用到贝塞尔曲线等. 如果全局需要这样风格的view,那么自定义一个View是非常必要的. 本文主要是个demo记录,如有需要的读者可以借鉴学习. Demo 主要

概述

在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等。

针对这样的场景,直接使用创建多个shape,定义多个xml文件也是可以实现的。但是如果使用非常频繁,那么直接自定义一个就会来的非常方便。

甚至在一些情况下,不是可以用shape定义的规则图形,比如需要用到贝塞尔曲线等。
如果全局需要这样风格的vIEw,那么自定义一个VIEw是非常必要的。

本文主要是个demo记录,如有需要的读者可以借鉴学习。

Demo

主要实现功能:

自定义圆角大小支持设置leftDrawable,和自定义文字内容(文字和img默认居中)支持点击效果


源码


RoundRadiusbutton.java

/** * author: xujiajia * description: * 1、drawable只有在设置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);//线的宽度设为0,避免画圆弧的时候部分圆弧与边界相切 paint.setStyle(Paint.Style.FILL_AND_stroke); path.setFillType(Path.FillType.WINDING); //左上圆角 path.moveto(0,roundRadius); rectF.set(0,2 * roundRadius,2 * roundRadius); path.addArc(rectF,180,90); //上边 path.lineto(wIDth - roundRadius,0); //右上圆角 rectF.set(wIDth - roundRadius * 2,wIDth,roundRadius * 2); path.addArc(rectF,-90,90); //右边 path.lineto(wIDth,height - roundRadius); //右下圆角 rectF.set(wIDth - roundRadius * 2,height - roundRadius * 2,height); path.addArc(rectF,90); //下边 path.lineto(roundRadius,height); //左下圆角 rectF.set(0,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); } //text,drawable两个一起计算位置 if (!TextUtils.isEmpty(textString)) { paint.setstrokeWIDth(1.5f); paint.setcolor(textcolor); paint.setTextSize(textSize); rect.setEmpty(); paint.getTextBounds(textString,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,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效果的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

总结

以上是内存溢出为你收集整理的android 自定义圆角button效果的实例代码(自定义view Demo)全部内容,希望文章能够帮你解决android 自定义圆角button效果的实例代码(自定义view Demo)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存