先看效果:
不忙的人写个view,忙的人直接用;人人为我,我为人人
功能:
- layout文件中,像Textview一样直接放上就能用
- layout文件中,可控制颜色,圆角,两个文字,等等
- 代码中可使用回调,可主动控制
Layout中这么用:
<com.andromeda.adm.myView.MyFalg2View
android:id="@+id/test"
android:layout_centerInParent="true"
android:layout_width="150dp"
app:falg_color="#eb5a49" 主颜色
app:falg_key1="母猪" 左侧选项文案
app:falg_key2="公猪" 右侧选项文案
app:falg_now_key="母猪" 选中文案
app:falg_text_size="14dp" 字体大小
app:falg_radius="8dp" 圆角大小
android:layout_height="40dp">
</com.andromeda.adm.myView.MyFalg2View>
代码中这么用:
//人工点击切换后的事件
myFalg2View.setOnFalgChage(new MyFalg2View.OnFalgChage() {
@Override
public void OnChange(String key) {
toast(key);
}
});
//可选,代码控制切换
myFalg2View.switchKey();
此view的代码如下:
public class MyFalg2View extends View {
private Paint paint1,paintT;
private int color1=0xffeb5a49;
private RectF rectFL,rectFR=null;
private int lineW=2;
private float textSzie=0,radius=0;
Path path1=null;
Path path2=null;
private String key1="男",key2="女";
private String nowKey="男";
public MyFalg2View(Context context) {
this(context, null);
}
public MyFalg2View(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyFalg2View(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.falgview2);
color1=ta.getColor(R.styleable.falgview2_falg_color,0xffeb5a49);
key1=ta.getString(R.styleable.falgview2_falg_key1);
key2=ta.getString(R.styleable.falgview2_falg_key2);
nowKey=ta.getString(R.styleable.falgview2_falg_now_key);
if(key1==null){
key1="男";
}
if(key2==null){
key2="女";
}
if(nowKey==null){
nowKey="男";
}
textSzie=ta.getDimension(R.styleable.falgview2_falg_text_size,12);
radius=ta.getDimension(R.styleable.falgview2_falg_radius,12);
initData();
}
private void initData(){
paint1=new Paint();
paint1.reset();
paint1.setStyle(Paint.Style.STROKE);
paint1.setStrokeCap(Paint.Cap.ROUND);
paint1.setColor(color1);
paint1.setStrokeWidth(lineW);
paint1.setAntiAlias(true);
paintT= new Paint(Paint.ANTI_ALIAS_FLAG);
paintT.setColor(0xffffffff);
paintT.setTextSize(textSzie);
setOnClickListener(view -> {
switchKey();
if(onFalgChage!=null){
onFalgChage.OnChange(nowKey);
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int w=getWidth();
int h=getHeight();
if(rectFL==null){
rectFL=new RectF(0+lineW,0+lineW,w/2,h-lineW);
}
if(rectFR==null){
rectFR=new RectF(w/2,0+lineW,w-lineW,h-lineW);
}
if(path1==null){
path1 = new Path();
float rids[] = {radius,radius,0,0,0,0,radius,radius};
path1.addRoundRect(rectFL, rids, Path.Direction.CW);
}
if(path2==null){
path2 = new Path();
float rids[] = {0,0,radius,radius,radius,radius,0,0};
path2.addRoundRect(rectFR, rids, Path.Direction.CW);
}
paint1.setStyle(nowKey.equals(key1)?Paint.Style.FILL_AND_STROKE:Paint.Style.STROKE);
canvas.drawPath(path1,paint1);
paint1.setStyle(nowKey.equals(key2)?Paint.Style.FILL_AND_STROKE:Paint.Style.STROKE);
canvas.drawPath(path2,paint1);
Paint.FontMetrics fontMetrics = paintT.getFontMetrics();
float y = getHeight()/2 + (Math.abs(fontMetrics.ascent) - fontMetrics.descent)/2;
float textWidth = paintT.measureText(key1);
paintT.setColor(key1.equals(nowKey)?0xffffffff:color1);
canvas.drawText(key1, (w/4-textWidth/2),y,paintT);
float textWidth2 = paintT.measureText(key2);
paintT.setColor(key2.equals(nowKey)?0xffffffff:color1);
canvas.drawText(key2, (w/4*3-textWidth2/2),y,paintT);
}
public void setKey(String key1,String key2,String nowKey){
this.key1=key1;
this.key2=key2;
this.nowKey=nowKey;
invalidate();
}
public void switchKey(){
nowKey=nowKey.equals(key1)?key2:key1;
invalidate();
}
public interface OnFalgChage{
void OnChange(String key);
}
private OnFalgChage onFalgChage;
public void setOnFalgChage(OnFalgChage onFalgChage){
this.onFalgChage=onFalgChage;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMySize(500, widthMeasureSpec);
int height = getMySize(200, heightMeasureSpec);
setMeasuredDimension(width, height);
}
private int getMySize(int defaultSize, int measureSpec) {
int mySize = defaultSize;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
switch (mode) {
case MeasureSpec.EXACTLY: {
mySize = size;
break;
}
case MeasureSpec.UNSPECIFIED: {
mySize = defaultSize;
break;
}
case MeasureSpec.AT_MOST: {
mySize = size;
break;
}
}
return mySize;
}
}
在attrs.xml中加上:
<declare-styleable name="falgview2">
<attr name="falg_color" format="color"/>
<attr name="falg_key1" format="string"/>
<attr name="falg_key2" format="string"/>
<attr name="falg_now_key" format="string"/>
<attr name="falg_text_size" format="dimension"/>
<attr name="falg_radius" format="dimension"/>
</declare-styleable>