zoukankan      html  css  js  c++  java
  • 收益曲线图

    收益曲线图

    布局:

    <?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();
        }
    }
    
    
    
     
     
  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/SongYongQian/p/8256922.html
Copyright © 2011-2022 走看看