我是靠谱客的博主 碧蓝唇膏,最近开发中收集的这篇文章主要介绍自定义控件——加减计数器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、需求分析

    目前,公司要求做一个房间套数和入住人数的加减计数器,需要在最小套数和入住人数时-不可点击并且置灰,在最大时+不可点击并置灰。决定做一个自定义控件——加减计数器,可以做加减选择。首先得写一个基础的加减计数器控件的布局,然后设置加减逻辑。

二、自定义控件——加减计数器

1、设置基本的布局xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="105dp"
    android:layout_height="30dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <LinearLayout
        android:id="@+id/ll_delta"
        android:layout_width="wrap_content"
        android:layout_marginRight="25dp"
        android:layout_height="match_parent">
        <ImageView
            android:id="@+id/iv_delete"
            android:src="@drawable/delete_unclicked"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
    </LinearLayout>


    <TextView
        android:id="@+id/tv_count"
        android:text="1人"
        android:textSize="13sp"
        android:textColor="@color/gray_4d4d4d"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/iv_add"
        android:src="@drawable/add_clicked"
        android:layout_marginLeft="25dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

2、设置加减计数器加减监听
       其中,ammout 为默认加减计数器的值,maxRange 为加减计数器最大值。
 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ll_delta:
                if (ammount > 1) {
                    ammount--;
                    if (ammount == 1) {
                        delete.setImageResource(R.drawable.delete_unclicked);
                        delta.setClickable(false);
                    }
                    count.setText(ammount + value);
                    add.setImageResource(R.drawable.add_clicked);
                    add.setClickable(true);
                } else {
                    delete.setImageResource(R.drawable.delete_unclicked);
                    delta.setClickable(false);
                }
                break;
            case R.id.iv_add:
                if (ammount < maxRange) {
                    ammount++;
                    if (ammount == maxRange) {
                        add.setImageResource(R.drawable.add_unclicked);
                        add.setClickable(false);
                    }
                    count.setText(ammount + value);
                    delete.setImageResource(R.drawable.delete_clicked);
                    delta.setClickable(true);
                } else {
                    add.setImageResource(R.drawable.add_unclicked);
                    add.setClickable(false);
                }
                break;
        }

    }

3、设置外部方法,可以改变加减计数器的范围以及加减计数器的显示内容、加减图片

/**
     * 外部设置属性的方法
     *
     * @param add
     * @param delete
     */
    public void setValues(int add, int delete, String value) {
        this.add.setImageResource(add);
        this.delete.setImageResource(delete);
        this.count.setText(ammount + value);
        this.value = value;
    }

4、设置加减外部监听
    
   if (mListener != null) {
            mListener.onAmountChange(this, ammount);
        }

三、计数器效果

      可点击状态:
 

       不可点击状态:


四、完整代码共享

public class AddDeleteView extends LinearLayout implements View.OnClickListener {
    private final ImageView delete;
    private final ImageView add;
    private final TextView count;
    private final LinearLayout delta;
    private int ammount = 1; // 加减计数器值
    private String value;//加减计数器的单位
    private int maxRange; // 加减计数器的最大值
    private OnAmountChangeListener mListener; // 加减计数器的加减监听

    public AddDeleteView(Context context) {
        this(context, null);
    }

    public AddDeleteView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public AddDeleteView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        LayoutInflater.from(context).inflate(R.layout.add_delete_view, this);
        delete = (ImageView) findViewById(R.id.iv_delete);
        count = (TextView) findViewById(R.id.tv_count);
        add = (ImageView) findViewById(R.id.iv_add);
        delta = (LinearLayout) findViewById(R.id.ll_delta);
        delta.setOnClickListener(this);
        add.setOnClickListener(this);

        TypedArray attr = getContext().obtainStyledAttributes(attrs, R.styleable.AddDeleteView);
        int tvTextSize = attr.getDimensionPixelSize(R.styleable.AddDeleteView_tvTextSize, 0);
        attr.recycle();
        if (tvTextSize != 0) {
            count.setTextSize(tvTextSize);
        }
    }

    public void setMaxRange(int maxRange) {
        this.maxRange = maxRange;
    }

    public void setAmmount(int ammount) {
        this.ammount = ammount;
    }

    /**
     * 外部设置属性的方法
     *
     * @param add
     * @param delete
     */
    public void setValues(int add, int delete, String value) {
        this.add.setImageResource(add);
        this.delete.setImageResource(delete);
        this.count.setText(ammount + value);
        this.value = value;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ll_delta:
                if (ammount > 1) {
                    ammount--;
                    if (ammount == 1) {
                        delete.setImageResource(R.drawable.delete_unclicked);
                        delta.setClickable(false);
                    }
                    count.setText(ammount + value);
                    add.setImageResource(R.drawable.add_clicked);
                    add.setClickable(true);
                } else {
                    delete.setImageResource(R.drawable.delete_unclicked);
                    delta.setClickable(false);
                }
                break;
            case R.id.iv_add:
                if (ammount < maxRange) {
                    ammount++;
                    if (ammount == maxRange) {
                        add.setImageResource(R.drawable.add_unclicked);
                        add.setClickable(false);
                    }
                    count.setText(ammount + value);
                    delete.setImageResource(R.drawable.delete_clicked);
                    delta.setClickable(true);
                } else {
                    add.setImageResource(R.drawable.add_unclicked);
                    add.setClickable(false);
                }
                break;
        }

        if (mListener != null) {
            mListener.onAmountChange(this, ammount);
        }
    }

    public void setOnAmountChangeListener(OnAmountChangeListener onAmountChangeListener) {
        this.mListener = onAmountChangeListener;
    }

    public interface OnAmountChangeListener {
        void onAmountChange(View view, int amount);
    }
}






最后

以上就是碧蓝唇膏为你收集整理的自定义控件——加减计数器的全部内容,希望文章能够帮你解决自定义控件——加减计数器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部