Android自定义view:折线图(附带动画效果)

package com.chk.uefa.thirdviews;

import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.os.AsyncTask;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.View;

import com.lidroid.xutils.util.LogUtils;

/** * Created by yuLook on 2016/4/7. */public class BrokenLineView extends View {

    private String price1,price2,price3,price4,price5,price6,price7;    private String maxPrice,minPrice;    private int wide=0,high=0;

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

    public BrokenLineView(Context context, AttributeSet attrs) {        super(context, attrs);    }

    public BrokenLineView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }

    /**七个价格坐标点*/    public void setSevenPrice(String price1,String price2,String price3,String price4,String price5,String price6,String price7){        this.price1=price1;        this.price2=price2;        this.price3=price3;        this.price4=price4;        this.price5=price5;        this.price6=price6;        this.price7=price7;    }

    /**Y轴最大值最小值*/    public void setMaxMinPrice(String maxPrice,String minPrice){        this.maxPrice=maxPrice;        this.minPrice=minPrice;    }

    /**获得宽高*/    public void setWideHigh(int wide,int high){        this.wide=wide;        this.high=high;

    }

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

        Paint p = new Paint();        p.setStrokeWidth((float) 2.0);        p.setAntiAlias(true);// 设置画笔的锯齿效果        p.setColor(getResources().getColor(R.color.red));

        if(wide>0){

            if(time<=5&&time>0){

                double s_y = getRoundY(price1);                double e_y = getRoundY(price2);                double a=(s_y-e_y)/5;                double b=s_y-a*time;                canvas.drawLine(0,(float) getRoundY(price1), wide/30*time,(float)  b, p);

            }else if(time>5&&time<=10){

                double s_y = getRoundY(price2);                double e_y = getRoundY(price3);                double a=(s_y-e_y)/5;                double b=s_y-a*(time-5);

                canvas.drawLine(0,(float) getRoundY(price1), wide/6, (float) getRoundY(price2), p);                canvas.drawLine(wide/6,  (float) getRoundY(price2), wide/6+(wide/6)*(time-5)/5,   (float) b, p);            }else if(time>10&&time<=15){

                double s_y = getRoundY(price3);                double e_y = getRoundY(price4);                double a=(s_y-e_y)/5;                double b=s_y-a*(time-10);

                canvas.drawLine(0,(float) getRoundY(price1), wide/6, (float) getRoundY(price2), p);                canvas.drawLine(wide/6,  (float) getRoundY(price2), wide/3,   (float) getRoundY(price3), p);                canvas.drawLine(wide/3,  (float) getRoundY(price3), wide/3+(wide/6)*(time-10)/5,   (float) b,  p);            }else if(time>15&&time<=20){

                double s_y = getRoundY(price4);                double e_y = getRoundY(price5);                double a=(s_y-e_y)/5;                double b=s_y-a*(time-15);

                canvas.drawLine(0,(float) getRoundY(price1), wide/6, (float) getRoundY(price2), p);                canvas.drawLine(wide/6,  (float) getRoundY(price2), wide/3,   (float) getRoundY(price3), p);                canvas.drawLine(wide/3,  (float) getRoundY(price3), wide/2,   (float) getRoundY(price4),  p);                canvas.drawLine(wide/2,  (float) getRoundY(price4), wide/2+(wide/6)*(time-15)/5, (float) b,  p);            }else if(time>20&&time<=25){

                double s_y = getRoundY(price5);                double e_y = getRoundY(price6);                double a=(s_y-e_y)/5;                double b=s_y-a*(time-20);

                canvas.drawLine(0,(float) getRoundY(price1), wide/6, (float) getRoundY(price2), p);                canvas.drawLine(wide/6,  (float) getRoundY(price2), wide/3,   (float) getRoundY(price3), p);                canvas.drawLine(wide/3,  (float) getRoundY(price3), wide/2,   (float) getRoundY(price4),  p);                canvas.drawLine(wide/2,  (float) getRoundY(price4), wide/6*4, (float) getRoundY(price5),  p);                canvas.drawLine(wide/6*4,(float) getRoundY(price5), wide/6*4+(wide/6)*(time-20)/5, (float) b,  p);            }else if(time>25){

                double s_y = getRoundY(price6);                double e_y = getRoundY(price7);                double a=(s_y-e_y)/5;                double b=s_y-a*(time-25);

                canvas.drawLine(0,(float) getRoundY(price1), wide/6, (float) getRoundY(price2), p);                canvas.drawLine(wide/6,  (float) getRoundY(price2), wide/3,   (float) getRoundY(price3), p);                canvas.drawLine(wide/3,  (float) getRoundY(price3), wide/2,   (float) getRoundY(price4),  p);                canvas.drawLine(wide/2,  (float) getRoundY(price4), wide/6*4, (float) getRoundY(price5),  p);                canvas.drawLine(wide/6*4,(float) getRoundY(price5), wide/6*5, (float) getRoundY(price6),  p);                canvas.drawLine(wide/6*5,(float) getRoundY(price6), wide/6*5+(wide/6)*(time-25)/5,     (float) b,  p);            }

//            canvas.drawLine(0,(float) getRoundY(price1), wide/6, (float) getRoundY(price2), p);//            canvas.drawLine(wide/6,  (float) getRoundY(price2), wide/3,   (float) getRoundY(price3), p);//            canvas.drawLine(wide/3,  (float) getRoundY(price3), wide/2,   (float) getRoundY(price4),  p);//            canvas.drawLine(wide/2,  (float) getRoundY(price4), wide/6*4, (float) getRoundY(price5),  p);//            canvas.drawLine(wide/6*4,(float) getRoundY(price5), wide/6*5, (float) getRoundY(price6),  p);//            canvas.drawLine(wide/6*5,(float) getRoundY(price6), wide,     (float) getRoundY(price7),  p);

        }    }

    //获得Y轴坐标点    private double getRoundY(String str){        double d_max = Double.parseDouble(maxPrice);        double d_min = Double.parseDouble(minPrice);

        //return ((double) high)-((Double.parseDouble(str)-d_min)/(d_max-d_min))*high;        return ((Double.parseDouble(str)-d_min)/(d_max-d_min))*high;    }

    //动画异步任务    private int time=0;    public class task extends AsyncTask{

        private Handler handler;        public task(Handler handler){            this.handler=handler;        }

        @Override        protected Object doInBackground(Object[] params) {

            for(int i=1;i<31;i++){                try {                    time=i;                    handler.sendEmptyMessage(1);                    Thread.sleep((long) (600/30));                }catch (Exception p){                    p.printStackTrace();                }            }            handler.sendEmptyMessage(2);            return null;        }    }

    //接受消息刷新界面    private Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what){                case 1:                    invalidate();                    break;                case 2:                    if(a!=null){                        a.cancel(true);                        a=null;                    }                    break;            }        }    };

    private AsyncTask a;

    //开始动画    public void start(){        a=new task(handler);        a.execute();    }

    //手动结束动画    public void stop(){        if(a!=null){            a.cancel(true);            a=null;        }        time=0;        invalidate();    }

}
时间: 2024-10-07 02:43:46

Android自定义view:折线图(附带动画效果)的相关文章

自定义view—折线图

学习导航 第一节:http://blog.csdn.net/bobo8945510/article/details/53197727 -自定义View-自定义属性及引用 第二节:http://blog.csdn.net/bobo8945510/article/details/53203233 自定义view02-图形绘制 第三节:http://blog.csdn.net/bobo8945510/article/details/53213938 自定义View-绘图基础之Path 第四节:http

Android自定义View之圆环交替 等待效果

学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首先是我们的attrs文件: <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="firstColor" format="color&qu

Android自定义view教程03---Android 属性动画 详解

1 package com.example.donghuatest; 2 3 import android.animation.ObjectAnimator; 4 import android.animation.PropertyValuesHolder; 5 import android.animation.ValueAnimator; 6 import android.animation.ValueAnimator.AnimatorUpdateListener; 7 import andro

Android 自定义View (二) 圆环交替 等待效果

我们在下载的时候需要一个下载的进度,而且可能产品要一个漂亮的界面,而不是android自带的进度条了,在这感谢http://blog.csdn.net/lmj623565791/article/details/24500107博客的无私奉献 废话不多说,直接切入主题 先新建一个android项目:CustomProgressBar 还记得自定义view的步骤么 1.自定义View的属性 2.在View的构造方法中获得我们自定义的属性 [ 3.重写onMesure ] 4.重写onDraw A:

Android 自定义View (三) 圆环交替 等待效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107 一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很适合的,就做了下,顺便和大家分享下,对于自定义View多练没坏处么.如果你看了前两篇,那么这篇一定so easy . 效果就这样,分析了一下,大概有这几个属性,两个颜色,一个速度,一个圆环的宽度. 还是我们自定View的那几个步骤: 1.自定义View的属性 2.在View的构造方法中获得我们自定义

Android 自定义绘制折线图(重点是Y轴的公式)

/** * 绘制折线图的公式Y轴坐标: y=height-((data-min)/(max-min))*height; 可以得到data在Y轴的坐标点 * height: 折线图 Y轴的坐标 * data: 数据源 * max: 数据源的最大值 * min: 数据源的最小值 * * */ /** * 绘制折线图: y轴左侧的数据 * * 1.根据需求 :显示几个数据 height/显示个数(平均分配Y轴) * 2.左侧数据: Y轴的顶部:数据源max值 Y轴的底部:数据源的min值 中间数据:取

Android 自定义view 折线翻页

看了Aige的 Android翻页效果原理实现之引入折线 有些计算原理 在此留个笔记 x.y 为 折出的三角形的 短边与长边; O(a,b)点即为触摸点 设K = w - a, L = h - b ?OMA中,由勾股定理,得出 ?OMA与 ?AOB.?APB三者之面积和 等于 梯形 MOBP的面积 代入x,解得 再代入触摸点(a,b) 即可求出当前对应的x.y了 有x.y现在就可以求出A点和B点的坐标了 A点(w - x, h) B点(w, h - y) 折线出的三角形即是:以Path的move

Android 自定义View 实现刮刮卡效果

主要思想: 将一个view设计成多层:背景层,含中奖信息等: 遮盖层,用于刮奖,使用关联一个Bitmap的Canvas 在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作) 使用paint.setXfermode 来进行消除手势滑动区域 /** * author : stone * email : [email protected] * time : 15/7/28 11 01 */ public class GuaView extends Vie

android自定义View之(四)------一键清除动画

1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用Frame anination的方式来实现,但是这个方法,不灵活,并且占资源,下面,我就采用自定义view的方法来实现这个功能. 2.效果图: 3.具体详细代码 3.1 \res\values\attrs_on_key_clear_circle_view.xml <resources> <de

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And