Android 自定义左右可滑动的柱状图

//自定义滑动的柱状图    视频无法上传 不好意思

public class HistogramView extends View {
    private Paint mLinePaint;
    private Paint mGreenPaint;
    private Paint mTextPaint;
    private Paint mWhitePaint;

    private Context mContext;
    private float mScale;
    private String[] y_title = {"200", "160", "120", "80", "40", "0"};
    private List<Integer> mData;
    private List<String> mNames;

    public static final int DATA_IN_SCREEN_NUMBER = 4;
    float mScreenWidth;
    float mHeight;
    float mDataLength;
    float mSpaceLength;
    int mLeftPosition = 0;
    int mMaxLeftPosition;
    float mX = 0;
    float mLength;

    public HistogramView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mLinePaint = new Paint();
        mGreenPaint = new Paint();
        mTextPaint = new Paint();
        mWhitePaint = new Paint();


        mLinePaint.setColor(Color.parseColor("#1D72F1"));
        mGreenPaint.setColor(Color.parseColor("#28A1FF"));
        mTextPaint.setColor(Color.parseColor("#08CEAD"));
        mWhitePaint.setColor(Color.parseColor("#ffffff"));


        mGreenPaint.setStyle(Paint.Style.FILL);
        mWhitePaint.setStyle(Paint.Style.FILL);

        mTextPaint.setAntiAlias(true);
        mGreenPaint.setAntiAlias(true);
        mLinePaint.setAntiAlias(true);
        mWhitePaint.setAntiAlias(true);
        mScale = context.getResources().getDisplayMetrics().density;

        mData = new ArrayList<>();
        mNames = new ArrayList<>();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mScreenWidth = 0.7F * MeasureSpec.getSize(widthMeasureSpec);
        mHeight = 0.70F * MeasureSpec.getSize(heightMeasureSpec);
        mDataLength = mScreenWidth * 0.55f / DATA_IN_SCREEN_NUMBER;
        mSpaceLength = mScreenWidth * 0.45f / DATA_IN_SCREEN_NUMBER;
        mLength = 0;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float min_height = mHeight / 5;
        for (int i = 5; i >= 0; i--) {
            if (i == 5) {
                mLinePaint.setARGB(255, 131, 148, 144);
            } else {
                mLinePaint.setARGB(255, 223, 233, 231);
            }
            //mScale + mScreenWidth+200  这是X轴长度
            canvas.drawLine( mScale, 30 * mScale + min_height * i,  mScale + mScreenWidth+230, 30 * mScale + min_height * i, mLinePaint);
        }
        float min_weight = 70 * mScale;
        mTextPaint.setTextSize(12 * mScale);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
        for (int i = 0; i < mData.size(); i++) {
            int leftR = (int) (20 * mScale + mLength + mSpaceLength + i * (mSpaceLength + mDataLength));
            int rightR = (int) (20 * mScale + mLength + (i + 1) * (mSpaceLength + mDataLength));
            int buttomR = (int) (30 * mScale + min_height * 5);
            int topR = buttomR - (int) (mHeight / 100 * (mData.get(i)/2));
            canvas.drawRect(new RectF(leftR, topR, rightR, buttomR), mGreenPaint);

            mTextPaint.setColor(Color.parseColor("#4D4D4D"));

            canvas.drawText(mNames.get(i), leftR + min_weight / 3-20, buttomR + 20 * mScale, mTextPaint);

            mTextPaint.setColor(Color.parseColor("#4D4D4D"));

            canvas.drawText((mData.get(i)) + "", leftR + min_weight / 3-20, topR - 10 * mScale, mTextPaint);
        }
        mTextPaint.setTextAlign(Paint.Align.RIGHT);
        mTextPaint.setTextSize(10 * mScale);
        canvas.drawRect(0, 0, 30 * mScale, mHeight / 0.7F, mWhitePaint);
        //底线的长度修改 100
        canvas.drawRect(200 * mScale + mScreenWidth, 0, mScreenWidth / 0.7F, mHeight / 0.7F, mWhitePaint);
        for (int i = 5; i >= 0; i--) {
            canvas.drawText(y_title[i], 30 * mScale, 32 * mScale + min_height * i, mTextPaint);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mData.size() <= 3)
            return true;
        float distance = 0;

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mX = event.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                if (mX == 0) {
                    mX = event.getX();
                }
                // move right
                if (mX - event.getX() < 0) {
                    distance = (int) Math.abs(event.getX() - mX);
                    if (mLeftPosition != 0) {
                        mLength += distance;

                        if (mLength > mSpaceLength + mDataLength) {
                            mLength = 0;
                            if (mLeftPosition > 0) {
                                --mLeftPosition;
                            }
                        }
                    } else {
                        mLength += distance;
                        if (mLength > 0) {
                            mLength = 0;
                        }
                    }

                    this.postInvalidate();
                }
                // move left
                else if (mX - event.getX() > 0) {
                    distance = (int) Math.abs(event.getX() - mX);
                    if (mLeftPosition != mMaxLeftPosition) {
                        mLength -= distance;

                        if (mLength < -mDataLength - mSpaceLength) {
                            mLength = 0;
                            if (mLeftPosition < mMaxLeftPosition) {
                                ++mLeftPosition;
                            }
                        }
                    } else {
                        mLength -= distance;
                        float v = 0;
                        if (mData.size() % 3 == 0) {
                            v = -mScreenWidth * (mData.size() / DATA_IN_SCREEN_NUMBER - 1);
                        } else if (mData.size() % 3 == 1) {
                            v = -mScreenWidth * (mData.size() / DATA_IN_SCREEN_NUMBER - 1) - 100 * mScale;
                        } else if (mData.size() % 3 == 2) {
                            v = -mScreenWidth * (mData.size() / DATA_IN_SCREEN_NUMBER) + 100 * mScale;
                        }
                        if (mLength < v) {
                            mLength = v;
                        }
                    }
                    this.postInvalidate();
                }
                mX = event.getX();
                break;
            case MotionEvent.ACTION_UP:
                mX = 0;
                break;
            default:
                break;
        }
        return true;
    }

    public void updateThisData(List<Integer> data, List<String> name) {
        mData = data;
        mNames = name;
        invalidate();
    }
}

 

//布局应用
<com.example.mathematics.utils.listViewutlis.HistogramView
    android:layout_marginRight="16dp"
    android:id="@+id/hv_rate"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:layout_marginTop="15.5dp"
    android:background="@color/color_FFFFFF" />

 

//应用

package com.example.mathematics.fragment;

import android.util.Log;
import android.view.View;
import android.widget.ScrollView;
import android.widget.Toast;

import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.mathematics.R;
import com.example.mathematics.adapter.StydyMeiYueAdapter;
import com.example.mathematics.base.BaseFragment;
import com.example.mathematics.bean.StudyMeiYueBean;
import com.example.mathematics.client.HttpUrlRoute;
import com.example.mathematics.utils.listViewutlis.HistogramView;
import com.example.mathematics.utils.listViewutlis.ListViewForScrollView;
import com.google.gson.Gson;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import okhttp3.Call;

public class StudyReportMeiYueFragment extends BaseFragment {


    int pageNum = 1;
    @BindView(R.id.hv_rate)
    HistogramView hvRate;
    @BindView(R.id.study_MeiZhou_ListView)
    RecyclerView studyMeiZhouListView;
    @BindView(R.id.mScroll)
    NestedScrollView mScroll;
    private StydyMeiYueAdapter mStydyMeiYueAdapter;
    private List<StudyMeiYueBean.DataBean.UserStudyMonthVoListBean> userStudyMonthVoList;

    @Override
    protected int getInitId() {
        return R.layout.study_report_meiyuefragment;
    }

    @Override
    protected void initView(View view) {
//        mScroll.post(new Runnable() {
//            @Override
//            public void run() {
                mScroll.scrollTo(0, 0);
//            }
//        });
    }

    @Override
    protected void initData() {
        mStydyMeiYueAdapter = new StydyMeiYueAdapter(R.layout.item_studymeizhou_apater,userStudyMonthVoList);
        studyMeiZhouListView.setLayoutManager(new LinearLayoutManager(getContext()));
        studyMeiZhouListView.setAdapter(mStydyMeiYueAdapter);
        getExercisesOkHttp(pageNum, 1);
    }

    @Override
    protected void initAdapter() {

    }

    @Override
    protected void initListener() {

    }

    //请求
    public void getExercisesOkHttp(int pageNum, final int num) {
        OkHttpUtils.get().url(HttpUrlRoute.BASE_URL + HttpUrlRoute.USERSTUDYMONTH_STUDYMONTH)
                .build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                loge(":" + e.getMessage());
                onErrorCode(e);
            }

            @Override
            public void onResponse(String response, int id) {
                loge("每月报告:" + response);
                StudyMeiYueBean bean = new Gson().fromJson(response, StudyMeiYueBean.class);
                int code = bean.getCode();
                if (code == 1000) {
                    userStudyMonthVoList = bean.getData().getUserStudyMonthVoList();
                    List<Integer> data = new ArrayList<>();
                    List<String> string = new ArrayList<>();
                    for (int i = 0; i < userStudyMonthVoList.size(); i++) {
                        data.add(userStudyMonthVoList.get(i).getTotalNum());
                        String substring = userStudyMonthVoList.get(i).getMonth();
                        Log.e("TAG", "onResponse: " + substring);
                        string.add(substring);
                    }
                    mStydyMeiYueAdapter.replaceData(userStudyMonthVoList);

                    //网络请求回来拼接的数据
                    hvRate.updateThisData(data, string);


                } else {
                    Toast.makeText(getContext(), "网络请求失败", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

}

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值