//自定义滑动的柱状图 视频无法上传 不好意思
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();
}
}
});
}
}