• 收益曲线图


    收益曲线图

    布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.lantianbaiyunyk.asus.rikao_1_9.MainActivity">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="#888888"
                android:textSize="18sp"
                android:text="每年年化收益率(%)"
                />
    
            <com.lantianbaiyunyk.asus.rikao_1_9.AnnualyieIdView
                android:id="@+id/line"
                android:layout_width="match_parent"
                android:layout_height="200dip"
                android:layout_marginTop="10dip"
                android:layout_marginBottom="10dip" />
        </LinearLayout>
    
    </RelativeLayout>

    MainActivity:

    public class MainActivity extends Activity {
        private AnnualyieIdView annualyieldView;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            annualyieldView=(AnnualyieIdView) findViewById(R.id.line);
            initdata();
        }
    
        private void initdata() {
            List<Float> yline=new ArrayList<Float>();
            yline.add(2.4f);
            yline.add(2.44f);
            yline.add(2.45f);
            yline.add(2.45f);
            yline.add(2.44f);
            yline.add(2.44f);
            yline.add(2.43f);
            annualyieldView.setDataY(yline);
        }
    }
    Math:
    public class Math {
        public static float initData(float a){
    
            if (2.40f<=a&&a<2.41f) {
                a=540f-540f/(a/0.01f);
            }else if(2.41f<=a&&a<2.42f){
                a=480f-480f/(a/0.01f);
            }else if (2.42f<=a&&a<2.43f) {
                a=360f-360f/(a/0.01f);
            }else if (2.43f<=a&&a<2.44f) {
                a=270f-270f/(a/0.01f);
            }else if (2.44f<=a&&a<2.45f) {
                a=180f-180f/(a/0.01f);
            }else if (2.45f<=a&&a<2.46f) {
                a=90f-90f/(a/0.01f);
            }
    
            return a;
    
        }
    }
    
    
    AnnualyieIdView:
    public class AnnualyieIdView extends View{
        private Paint mTextPaint, mLinePaint,mPathPaint,mPointPaint;
        //柱状图的宽度
        private float mPaintRectWidth;
        //路径
        private Path mPath;
        //高跟宽
        private float mWidth, mHeight;
        //柱状图的数量
        private final float mCount = 6;
        //偏移量
        private final float offsets=1;
    
        private float mRectHeight;
        //x轴的坐标
        private List<Float> xline=new ArrayList<Float>();
        //Y轴的坐标
        private List<Float> yline=new ArrayList<Float>();
    
        //左边文字
        private float []x={2.46f,2.45f,2.44f,2.43f,2.42f,2.41f,2.40f};
        //底部文字
        private String [] day={"07-01","07-02","07-03","07-04","07-05","07-06","07-07"};
    
        public AnnualyieIdView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            initView();
    
        }
    
        public AnnualyieIdView(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            initView();
        }
    
        public AnnualyieIdView(Context context) {
            super(context);
    
            initView();
        }
    
        private void initView() {
            //绘制线和文字的颜色
            mTextPaint = new Paint();
            mTextPaint.setAntiAlias(true);
            mTextPaint.setColor(Color.parseColor("#cccccc"));
            mTextPaint.setTextSize(25);
            mTextPaint.setStrokeWidth(1);
    
            //绘制折线图的点
            mPointPaint= new Paint();
            mPointPaint.setAntiAlias(true);
            mPointPaint.setColor(Color.parseColor("#000000"));
            mPointPaint.setTextSize(25);
            mPointPaint.setStrokeWidth(5);
    
            //绘制柱状图的画笔
            mLinePaint = new Paint();
            mLinePaint.setAntiAlias(true);
    
            //绘制折线图的画笔
            mPathPaint= new Paint();
            mPathPaint.setAntiAlias(true);
            mPathPaint.setColor(Color.parseColor("#ff0000"));
            mPathPaint.setStyle(Paint.Style.STROKE);
    
            //折线图的路径
            mPath=new Path();
    
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mWidth=(float)(getWidth()-getWidth()*0.1);
            mHeight=(float)(getHeight()-getHeight()*0.1);
            mRectHeight=(float)(getHeight()-getHeight()*0.1);
            mPaintRectWidth=(float) (mWidth*0.8/mCount);
            mLinePaint.setStrokeWidth(mPaintRectWidth);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            onDrawRect(canvas);
            onDrawLine(canvas);
            canvasPath(canvas);
        }
        //绘制6个矩形
        private void onDrawRect(Canvas canvas) {
            for (int i = 0; i < 7; i++) {
                if (i%2==0) {
                    mLinePaint.setColor(Color.parseColor("#eeeeee"));
                }else {
                    mLinePaint.setColor(Color.parseColor("#ece1f3"));
                }
                float left  =(float) (mWidth * 0.4 / 2 + mPaintRectWidth * i + offsets);
                float right=(float) (mWidth * 0.4 / 2 + mPaintRectWidth* (i + 1));
    
                canvas.drawRect(left,(float)(mRectHeight*0.01),right, mHeight, mLinePaint);
            }
    
        }
        //绘制网格线
        private void onDrawLine(Canvas canvas){
            //第一条线
            canvas.drawLine(mPaintRectWidth-mPaintRectWidth/2, (float)(mRectHeight*0.01), getWidth(),  (float)(mRectHeight*0.01), mTextPaint);
            //定义这里高度
            float height;
            //横七条
            for (float i = 0; i < 7; i++) {
                //从上到下
                if (i==0) {
                    height=i;
                }else {
                    height=mRectHeight*(i/6);
                    float size=mTextPaint.measureText(x[(int)i]+"");
                    //绘制线
                    canvas.drawLine(mPaintRectWidth+mPaintRectWidth/2, height, getWidth(),  height, mTextPaint);
                    //绘制左边Y轴的文字
                    canvas.drawText(x[(int)i]+"", (float)(mPaintRectWidth-mPaintRectWidth*0.35), height+size/5, mTextPaint);
                }
    
            }
            //竖七条
            canvas.drawLine((float) (mPaintRectWidth-mPaintRectWidth/2),0, (float) (mPaintRectWidth-mPaintRectWidth/2),  mHeight, mTextPaint);
            for (float i = 0; i < 7; i++) {
                //从左到右
                canvas.drawLine((float) (mWidth * 0.4 / 2 + mPaintRectWidth * i),0, (float) (mWidth * 0.4 / 2 + mPaintRectWidth * i),  mHeight, mTextPaint);
                //绘制底边的日期文字
                canvas.drawText(day[(int) i], (float) (mWidth * 0.34 / 2 + mPaintRectWidth * i), (float)(mHeight+mHeight*0.1), mTextPaint);
                //准备好下面折线图的X轴坐标
                xline.add((float) (mWidth * 0.4 / 2 + mPaintRectWidth * i));
            }
            //折线图的第一个点
            xline.add((float) (mPaintRectWidth-mPaintRectWidth/2));
    
    
    
        }
        //绘制折线路径
        public void canvasPath(Canvas canvas){
    
    
            for (int j = 0; j < yline.size(); j++) {
    
                float x=xline.get(j);
                float y =yline.get(j);
                float aftery=Math.initData(y);
                if (j==0) {
                    mPath.moveTo(x,aftery );
                }else{
    
                    mPath.lineTo(x,aftery );
                }
                canvas.drawPoint(x, aftery, mPointPaint);
                float size=mPointPaint.measureText(y+"");
                canvas.drawText(y+"", (float)(x-size/2), (float)(aftery+size*0.25), mPointPaint);
            }
            canvas.drawPath(mPath, mPathPaint);
        }
        //用于设置Y轴的坐标值
        public void setDataY( List<Float> yline) {
            this.yline.clear();
            this.yline=yline;
        }
        //一个更新UI的方法
        public void invalidata(){
            invalidate();
        }
    }
    
    
    
     
     
  • 相关阅读:
    第六周总结
    《构建之法》读后感二
    移动端疫情展示
    第五周
    用python爬取疫情数据
    第四周
    疫情图表展示和时间查询
    wpf datagrid row height 行高自动计算使每行行高自适应文本
    c# 实现mysql事务
    c# 简单实现 插件模型 反射方式
  • 原文地址:https://www.cnblogs.com/SongYongQian/p/8256922.html
Copyright © 2020-2023  润新知