安卓标签选项卡自定义View直接复制就能用

先看效果:

在这里插入图片描述

不忙的人写个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>
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值