android自定义view实现购物车数量选取

首先感谢ljp345775博主的这篇文章(android 自定义组合控件并实现点击事件),有兴趣可以去看看,
在这里插入图片描述

1、控件布局文件

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

    <TextView
        android:id="@+id/switch_number_reduce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="-" />

    <TextView
        android:id="@+id/switch_number_show"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:background="@color/color_E9EDF0"
        android:paddingLeft="15dp"
        android:gravity="center"
        android:paddingRight="15dp"
        android:text="1" />

    <TextView
        android:id="@+id/switch_number_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="+" />

</LinearLayout>
    <color name="color_E9EDF0">#E9EDF0</color>

2、具体代码实现

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

/**
 * User: wangyn
 * Date: 2020/5/21 16:19
 * Description:商品数量调节组合控件 主要控制最少选取以及最大选取(库存)
 */
public class SwitchNumber extends LinearLayout implements View.OnClickListener {


    private Context context;
    //默认最小值 最大值
    private int minimum = 1;//最小选取
    private int maximum = 99;//最大选取,可以是0 库存
    private int showNumber = 1;//默认显示 1

    private I_GetNumber iGetNumber;
    private final TextView switch_number_show;

    public SwitchNumber(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context = context;

        LayoutInflater.from(context).inflate(R.layout.view_switch_number, this, true);

        TextView switch_number_reduce = findViewById(R.id.switch_number_reduce);
        switch_number_show = findViewById(R.id.switch_number_show);
        TextView switch_number_add = findViewById(R.id.switch_number_add);

        switch_number_show.setText(String.valueOf(showNumber));
        switch_number_reduce.setOnClickListener(this);
        switch_number_add.setOnClickListener(this);

    }

    //设置当前购物车商品数量
    public void setShowNumber(int showNumber) {
        this.showNumber = showNumber;
        switch_number_show.setText(String.valueOf(this.showNumber));
    }

    //库存 可以是0
    public void setMaximum(int maximum) {
        this.maximum = maximum;
//        if (maximum == 0) {
//            switch_number_show.setText(String.valueOf(maximum));
//        }
    }

    public void setiGetNumber(I_GetNumber iGetNumber) {
        this.iGetNumber = iGetNumber;
    }

    @Override
    public void onClick(View v) {

        //库存为0的情况下不可以操作
        if (maximum == 0) {
            Toast.makeText(context, "缺货中", Toast.LENGTH_SHORT).show();
            return;
        }
        int number = Integer.parseInt(switch_number_show.getText().toString());
        switch (v.getId()) {
            case R.id.switch_number_reduce:
                if (minimum == number) {
                    Toast.makeText(context, "最少购买1件商品", Toast.LENGTH_SHORT).show();
                    return;
                }
                number -= 1;
                switch_number_show.setText(String.valueOf(number));
                if (null != iGetNumber) {
                    iGetNumber.getNumber(number);
                }
                break;

            case R.id.switch_number_add:
                if (maximum <= number) {
                    Toast.makeText(context, "最多购买" + maximum + "商品", Toast.LENGTH_SHORT).show();
                    return;
                }
                number += 1;
                switch_number_show.setText(String.valueOf(number));
                if (null != iGetNumber) {
                    iGetNumber.getNumber(number);
                }
                break;
        }
    }

    //定义接口 返回最终数量 用以计算价格
    public interface I_GetNumber {
        void getNumber(int number);
    }
}

3、布局文件中应用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:background="@color/color_FFFFFF"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <ImageView
        android:id="@+id/item_goods_selector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:src="@mipmap/ic_shopping_cart_un" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/item_goods_image"
            android:layout_width="100dp"
            android:layout_height="80dp"
            android:src="@mipmap/ic_default_img" />

        <TextView
            android:id="@+id/item_goods_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/item_goods_image"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="商品标题" />

        <TextView
            android:id="@+id/item_goods_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/item_goods_title"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_toRightOf="@+id/item_goods_image"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="商品规格信息查看" />

        <TextView
            android:id="@+id/item_goods_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/item_goods_info"
            android:layout_toRightOf="@+id/item_goods_image"
            android:text="¥112"
            android:textColor="@color/color_FF0000" />

        <com.qingsen.jinyuantang.views.SwitchNumber
            android:id="@+id/item_goods_switch_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true" />

    </RelativeLayout>

</LinearLayout>

3、适配器中使用

import android.content.Context;
import android.util.Log;
import android.widget.ImageView;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.qingsen.jinyuantang.R;
import com.qingsen.jinyuantang.ui.shop.bean.GoodsBean;
import com.qingsen.jinyuantang.views.SwitchNumber;

import java.util.HashMap;
import java.util.List;

/**
 * User: wangyn
 * Date: 2020/5/21 10:50
 * Description: 购物车适配器
 */
public class ShoppingCartAdapter extends BaseQuickAdapter<GoodsBean, BaseViewHolder> {

    private Context context;
    private HashMap<Integer, GoodsBean> hashMap = new HashMap<>();//单选、多选数据保存

    public ShoppingCartAdapter(List<GoodsBean> data, Context context) {
        super(R.layout.item_shopping_cart, data);
        this.context = context;
    }

    @Override
    protected void convert(BaseViewHolder baseViewHolder, GoodsBean goodsBean) {
        int layoutPosition = baseViewHolder.getLayoutPosition();
        ImageView imageView = baseViewHolder.getView(R.id.item_goods_selector);
        GoodsBean bean = hashMap.get(layoutPosition);
        imageView.setImageResource(null != bean ? R.mipmap.ic_shopping_cart : R.mipmap.ic_shopping_cart_un);
		//数量选取控件应用
        SwitchNumber switchNumber = baseViewHolder.getView(R.id.item_goods_switch_number);
        switchNumber.setMaximum(layoutPosition);//设置库存数量
        switchNumber.setiGetNumber(new SwitchNumber.I_GetNumber() {
            @Override
            public void getNumber(int number) {
                Log.e("TAG", "getNumber: " + number);
                //这里 要修改购物车产品数量属性 不然滑动的话会数据错乱
            }
        });
    }

    //多选、复选删除、再次选择
    public void multipleChoice(int position, GoodsBean bean) {
        GoodsBean goodsBean = hashMap.get(position);
        if (null != goodsBean) {
            hashMap.remove(position);
        } else {
            hashMap.put(position, bean);
        }
        notifyDataSetChanged();
    }

    //单选 复选删除 再次选择
    public void singleChoice(int position, GoodsBean goodsBean) {
        hashMap.clear();
        hashMap.put(position, goodsBean);
        notifyDataSetChanged();
    }
}

5、没了就这些 ,没怎么测试,有BUG的话再改

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android屏幕坐标色彩指的是以屏幕左上角为原点的坐标系中,每个像素点所对应的颜色值。在Android中,可以通过获取屏幕上某一点的颜色值来实现一些特定的功能,比如颜色取色器、拾色器等。 实现颜色选取器可以借助自定义View来完成。具体步骤如下: 1. 自定义一个View,继承自View类,重写onDraw()方法。 2. 在onDraw()方法中,绘制一个渐变的色带,可以使用LinearGradient类来实现。同时,绘制一个小圆圈,表示当前选中的颜色。 3. 为View设置一个触摸事件,当手指按下、移动、抬起时,获取当前手指所在点的坐标,计算出对应的颜色值,并更新小圆圈的位置和颜色。 4. 在View的回调方法中,通知外部监听器当前选中的颜色值,以便外部进行相应的处理。 下面是一个示例代码,可以用来实现一个简单的颜色选取器: ``` public class ColorPickerView extends View { private Paint mPaint; private Paint mCirclePaint; private int mCurrentColor; private float mCurrentX; private float mCurrentY; private OnColorChangeListener mListener; public ColorPickerView(Context context) { super(context); init(); } public ColorPickerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ColorPickerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setStyle(Paint.Style.STROKE); mCirclePaint.setStrokeWidth(5); mCirclePaint.setColor(Color.BLACK); mCurrentColor = Color.RED; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int[] colors = {Color.RED, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA, Color.RED}; float[] positions = {0, 1f / 6, 2f / 6, 3f / 6, 4f / 6, 5f / 6, 1}; LinearGradient gradient = new LinearGradient(0, 0, getWidth(), getHeight(), colors, positions, Shader.TileMode.CLAMP); mPaint.setShader(gradient); canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint); canvas.drawCircle(mCurrentX, mCurrentY, 15, mCirclePaint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: mCurrentX = x; mCurrentY = y; int pixel = getPixelColor((int) x, (int) y); mCurrentColor = pixel; invalidate(); if (mListener != null) { mListener.onColorChanged(pixel); } return true; case MotionEvent.ACTION_UP: return true; } return super.onTouchEvent(event); } private int getPixelColor(int x, int y) { Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); draw(canvas); return bitmap.getPixel(x, y); } public int getCurrentColor() { return mCurrentColor; } public void setOnColorChangeListener(OnColorChangeListener listener) { mListener = listener; } public interface OnColorChangeListener { void onColorChanged(int color); } } ``` 在使用时,可以将该View添加到布局文件中,并设置一个监听器,监听器可以获取到当前选中的颜色值。 ``` ColorPickerView colorPickerView = (ColorPickerView) findViewById(R.id.color_picker_view); colorPickerView.setOnColorChangeListener(new ColorPickerView.OnColorChangeListener() { @Override public void onColorChanged(int color) { // do something with the color } }); ``` 这样,就可以通过自定义View实现一个颜色选取器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值