自定义View添加滑动事件

这个主要介绍自定义view添加滑动事件,就用上篇文章中的条形图了,主要是看添加滑动,这个图就不贴了,我不会弄gif,需要的自己复制代码看效果吧

public class BarChartView extends View {
    private int mWindowWidth;  //屏幕宽
    private int mViewWidth; //view宽
    private int mViewHeight; //view高
    private List<DataEnty> datas = new ArrayList<>();  //图表数据
    private Paint barChartPaint; //条形图画笔
    private Paint coordinatePaint; //坐标系画笔
    private Paint bgPaint; //坐标系画笔
    private Paint textPaint; //文字画笔
    private int distance = 100; //边距的大小,用于留地方写文字
    private int mMarginLeft; //左边距
    private int cell = 50;  //柱子之间的间隙
    private int barWidth = 50; //柱子的宽度
    private float startX = 0;//按下的坐标
    private float xInit = 0f;//第一个点X的坐标
    private float maxXInit = 0f;//第一个点对应的最大x坐标
    private float minXInit = 0f;//第一个点对应的最小X坐标

    public BarChartView(Context context) {
        super(context);
    }

    public BarChartView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public BarChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mViewHeight = h;
        mViewWidth = w;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        int layerId = canvas.saveLayer(0F, 0F, mViewWidth, mViewHeight, null, Canvas.ALL_SAVE_FLAG);

        mWindowWidth = DimenUtils.getScreenWidth();

        //初始化画笔
        barChartPaint = new Paint();

        barChartPaint.setColor(Color.RED);

        barChartPaint.setAntiAlias(true);

        coordinatePaint = new Paint();

        coordinatePaint.setColor(Color.BLUE);

        coordinatePaint.setTextSize(30);

        coordinatePaint.setAntiAlias(true);

        coordinatePaint.setStrokeWidth(5);

        textPaint = new Paint();

        textPaint.setTextSize(40);

        textPaint.setAntiAlias(true);

        textPaint.setColor(Color.CYAN);

        mMarginLeft = getSize(100);

        bgPaint = new Paint();

        bgPaint.setColor(Color.parseColor("#00000000"));

        //画X轴
        canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),mViewWidth+getSize(distance),mViewHeight-getSize(distance),coordinatePaint);
        //画Y轴
        canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),getSize(distance),0,coordinatePaint);

        List<Integer> number = new ArrayList<>();

        for (int i = 0;  i < datas.size(); i++) {

            number.add(datas.get(i).getNumber());
        }
        //取出数组中的最大值计算图的比例,防止因为数字过大或者过小显示不出或者显示不全
        int max = Collections.max(number);
        //绘制柱子
        for (int i = 0; i < datas.size(); i++) {
            float scale = (float) (datas.get(i).getNumber() / (float)(max+200));
            //循环画圆柱
            canvas.drawRect(mMarginLeft+mMarginLeft+i*getSize(cell) + (getSize(barWidth)) * i+xInit, (mViewHeight-scale * (mViewHeight-getSize(getSize(distance))))-getSize(distance), mMarginLeft +i*getSize(cell)+ getSize(barWidth) * i + getSize(barWidth)+xInit, mViewHeight-getSize(distance), barChartPaint);

            float v3 = textPaint.measureText(String.valueOf(datas.get(i).getNumber()));

            float x3 = (mMarginLeft +i*getSize(cell)+ getSize(barWidth) * i + getSize(barWidth)+getSize(barWidth/2))-getSize(v3/2)+xInit;

            canvas.drawText(String.valueOf(datas.get(i).getNumber()), x3, (mViewHeight-scale * (mViewHeight-getSize(distance)))-getSize(distance+20), textPaint);
            //绘制X轴文字
            canvas.drawText(datas.get(i).getDate(),x3,mViewHeight-getSize(50),coordinatePaint);

        }
        // 将折线超出x轴坐标的部分截取掉
        bgPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        canvas.drawRect(0F, 0F, distance, mViewHeight, bgPaint);
        bgPaint.setXfermode(null);

        canvas.restoreToCount(layerId);

        for (int i = 0; i < 7; i++) {
            //绘制Y轴的文字
            float textWidth = coordinatePaint.measureText(String.valueOf(datas.get(i).getNumber()));
            canvas.drawText(String.valueOf(i*100),textWidth/2,mViewHeight-getSize(distance)-(((mViewHeight-getSize(distance))/7)*i),coordinatePaint);

        }
    }


    private int getSize(int size){
        //因为用的1080手机做的适配  所以这里除以1080
        float  a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
        return (int) a;
    }

    private float getSize(float size){
        //因为用的1080手机做的适配  所以这里除以1080
        float  a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
        return  a;
    }
    public void setData(List<DataEnty> enty) {
        datas.clear();
        datas.addAll(enty);
        invalidate();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                minXInit = getWidth() - (getWidth() - getSize(distance)) * 0.1f - getSize(distance) * (datas.size() - 1) - distance / 2 ;//减去0.
                break;
            case MotionEvent.ACTION_MOVE:
                if (distance * datas.size() - distance > getWidth() - getSize(distance) - distance) { //当期的宽度不足以呈现全部数据
                    float dis = event.getX() - startX;
                    if (Math.abs(dis) > 3) {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                    startX = event.getX();
                    if (xInit + dis < minXInit) {
                        xInit = minXInit;
                    } else if (xInit + dis > maxXInit) {
                        xInit = maxXInit;
                    } else {
                        xInit += dis;
                    }
                    invalidate();
                }
                    break;
        }
        return true;
    }
}

实体类

public class DataEnty {

    private int number;

    private String date;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,你可以通过自定义控件来实现进度条的滑动效果。首先,你需要在布局文件中添加自定义控件的声明,如下所示: ``` <com.test.MyProgress android:layout_width="match_parent" android:layout_height="match_parent" /> ``` \[1\] 接下来,你可以在自定义控件的类中添加自定义属性,以便在布局文件中进行设置。你可以使用`declare-styleable`标签来定义这些属性,如下所示: ``` <declare-styleable name="MyProgress"> <!--背景颜色--> <attr name="myProgressBgColor" format="color|reference"/> <!--进度条颜色--> <attr name="myProgressColor" format="color|reference"/> <!--进度--> <attr name="myProgress" format="integer"/> <!--进度条的高--> <attr name="myProgressHeight" format="dimension|reference"/> <!--中间的图片--> <attr name="myProgressImg" format="reference"/> <!--圆角--> <attr name="myProgressRadius" format="dimension"/> </declare-styleable> ``` \[2\] 最后,你可以在自定义控件的类中使用`invalidate()`方法来刷新View,以便在修改某个view的显示时看到重新绘制的界面。需要注意的是,`invalidate()`方法必须在UI线程中进行工作,一般在自定义控件中会用到这个方法。\[3\] 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [Android 自定义滑动进度条](https://blog.csdn.net/lhqq_/article/details/121359777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android自定义进度条的圆角横向进度条实例详解](https://blog.csdn.net/weixin_30019517/article/details/117344553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值