android 做图表(柱状图,折线图)用什么做的

2024-05-06 02:45

1. android 做图表(柱状图,折线图)用什么做的

这个需要导入第三方专门做图表的库的,不过很多都是开源的免费使用。这个在网上一搜到处都是的。
你可以参考下这篇文章:http://blog.csdn.net/hejjunlin/article/details/51774964

android 做图表(柱状图,折线图)用什么做的

2. android中怎么画统计图

code/p/achartengine/downloads/list 
这是Google做的achartengine,里面有条形图的,但愿有用,你也可以用Canvas自己来画图,也很简单

3. 安卓自定义折线统计图demo


安卓自定义折线统计图demo

4. android中这样的曲线要怎么绘制

绘制曲线图首先需要画好横竖坐标轴建立坐标系,比如坐标系中的100距离应该在canvas中绘制多长,这个是需要计算的,其实坐标体系的建立是最复杂的,我看过很多第三方库的建立方法都不一样,有的要灵活一些,有的比较死板。至于绘制曲线要么是用Canvas.drawLine方法,要么是用Path.lineTo方法,看你自己的习惯。

为了做出一个外观良好的曲线图,我参考了两个开源代码,第一个的曲线图绘制限制较多,使用范围太窄,但是有数据变化时的动画效果。第二个的适用范围很广,他能根据数据集合自动计算横纵坐标的个数,在canvas上单元格的距离,只需输入坐标点就能自动建立坐标体系绘制曲线,但是没有动画效果。
先讲第一个LineView。

LineView的demo可以在这里下载,lineview其实只是github项目的一部分,我是将其提取出来了的,个人觉得他的其他部分没有参考价值。作者好像是个韩国人。

LineView的曲线绘制没有什么可取的部分,我想学习的是他实现动画效果的方法,设计的很好,但具体实现还需要改进,让动画更流畅。

Lineview的调用方法:
在xml中添加lineview控件
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/horizontalScrollView"
android:layout_alignParentRight="true"

android:layout_above="@+id/line_button">
<view
android:layout_width="wrap_content"
android:layout_height="200dp"
class="com.example.widget.LineView"
android:id="@+id/line_view"/>

在activity代码中获取lineview对象:
finalLineView lineView = (LineView)findViewById(R.id.line_view);

添加横坐标:
int randomint = 9;
ArrayListtest =newArrayList();
for (int i=0;i<randomint; i++){
test.add(String.valueOf(i+1));
}
lineView.setBottomTextList(test);
允许绘制坐标点:
lineView.setDrawDotLine(true);
lineView.setShowPopup(LineView.SHOW_POPUPS_NONE);

ArrayList dataList = newArrayList();
intrandom = (int)(Math.random()*9+1);
for (int i=0;i<randomint; i++){
dataList.add((int)(Math.random()*random));
}
添加纵坐标的值:
ArrayList>dataLists = newArrayList>();
dataLists.add(dataList);
lineView.setDataList(dataLists);
从其用法中可以看出,lineview需要提前设定横坐标的范围,而且纵坐标的值必须和lineView.setBottomTextList(test)中添加的值一一对应(读lineview源码可以知道),使用起来很不方便,我觉得作者仅仅是做出了一条曲线而已,而不太关注是否有用。和很多曲线图的开源代码一样lineview允许一次绘制几根颜色不同的曲线。
只需在上面的代码中为dataLists再添加一个list成员就行。

5. Android开发:如何实现柱状图或折线图不同数值范围(正负值)显示不同颜色?

  推荐你几个相关开源项目,可以根据需要自己选择,自己画还是比较麻烦的:
MPAndroidChart
强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、网状图及各种图的结合;支持图的拖拽缩放;支持 Android 2.2 以上,支持横纵轴缩放,多指缩放,展现动画、高亮、保存到 sdcard、从文件读取图表
achartengine
强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合
GraphView
绘制图表和曲线图的View,可用于Android上的曲形图、柱状图、波浪图展示
HoloGraphLibrary
绘制线状图、柱状图、饼状图
XCL-Charts
XCL-Charts基于原生的Canvas来绘制各种图表,在设计时,尽量在保证开发效率的同时,给使用者提供足够多的定制化能力。因此使用简便,同时具有相当灵活的定制能力。目前支持3D/非3D柱形图(Bar Chart)、3D/非3D饼图(Pie Chart)、堆积图(Stacked Bar Chart)、面积图(Area Chart)、 折线图(Line Chart)、曲线图(Spline Chart)、环形图(Dount Chart)、南丁格尔玫瑰图(Rose Chart)、仪表盘(Dial Chart)、刻度盘(Gauge Chart)、雷达图(Radar Chart)、圆形图(Circle Chart)等图表。其它特性还包括支持图表缩放、手势移动、动画显示效果、高密度柱形显示、图表分界定制线、多图表的混合显示及同数据源不同类型图表切换等。
EazeGraph
Android 图表库,支持柱状图、分层柱状图、饼状图、线性图
WilliamChart
绘制图表的库,支持LineChartView、BarChartView和StackBarChartView三中图表类型,并且支持 Android 2.2及以上的系统。
HelloCharts for Android
支持折线图、柱状图、饼图、气泡图、组合图;支持预览、放大缩小,滚动,部分图表支持动画;支持 Android 2.2 以上

  这些项目都可以在GitHub 搜索到。
希望对你有所帮助!

Android开发:如何实现柱状图或折线图不同数值范围(正负值)显示不同颜色?

6. android中如何实现,动态的柱状图显示,

有很多动态的第三方库可以使用。例如achartengine

AChartEngine是一款基于Android的图表绘制引擎,它为Android开发者提供了很多实用的图表绘制工具类。

7. 如何在android studio 中实现圆饼图的转动

/** * 随手记中可以任意旋转的炫酷饼图的实现原理 *  * 小记: * 在实现的过程中,主要是用到了一些数学计算来实现角度和屏幕位置坐标的计算 * 关于任意两个点之间的角度计算的问题,一开始想了很久没有结果,最后,一个偶然的灵光,让整个 * 事情变得简单起来,就是计算任意两个点相对于中心坐标的角度的时候,首先,计算 * 每个点相对于x轴正方向的角度,这样,总可以将其转化为计算直角三角形的内角计算问题 * 再将两次计算的角度进行减法运算,就实现了。是不是很简单?呵呵,对于像我们这样数学 * 没有学好的开发者来说,也只有这样化难为简了 *  * @author liner * */public class PieChart extends View{public static final String TAG = "PieChart";public static final int ALPHA = 100;public static final int ANIMATION_DURATION = 800;public static final int ANIMATION_STATE_RUNNING = 1;public static final int ANIMATION_STATE_DOWN = 2;/*** 不要问我这个值是怎么设置的。这个就是图片中的一大块圆形区域对应的长方形四个边的坐标位置* 具体的值,自己需要多次尝试并调整了。这样,我们的饼图就是相对于这个区域来画的*/private static final RectF OVAL = new RectF(18,49,303,340);private int[] colors; //每部分的颜色值private int[] values; //每部分的大小private int[] degrees; //值转换成角度private String[] titles; //每部分的内容private Paint paint;private Paint maskPaint;private Paint textPaint;private Point lastEventPoint;private int currentTargetIndex = -1;private Point center; //这个是饼图的中心位置private int eventRadius = 0; //事件距离饼图中心的距离//测试的时候使用的//private ChartClickListener clickListener;private Bitmap mask; //用于遮罩的Bitmapprivate int startDegree = 90; //让初始的时候,圆饼是从箭头位置开始画出的private int animState = ANIMATION_STATE_DOWN;private boolean animEnabled = false;private long animStartTime;public PieChart(Context context) {super(context);init();}public PieChart(Context context, AttributeSet attrs){this(context, attrs, 0);}public PieChart(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);init();}private void init(){paint = new Paint();maskPaint = new Paint();textPaint = new Paint();textPaint.setColor(Color.WHITE);textPaint.setTypeface(Typeface.DEFAULT_BOLD);textPaint.setAlpha(100);textPaint.setTextSize(16);values = new int[]{60,90,30,50,70};//titles = new String[]{//"川菜",//"徽菜",//"粤菜",//"闽菜",//"湘菜"//};//测试文字居中显示titles = new String[]{"我是三岁","说了算四大皆空","士大","史蒂芬森地","湘"};colors = new int[]{Color.argb(ALPHA, 249, 64, 64),Color.argb(ALPHA, 0, 255, 0),Color.argb(ALPHA, 255, 0, 255),Color.argb(ALPHA, 255, 255, 0),Color.argb(ALPHA, 0, 255, 255)};degrees = getDegrees();//Drawable d = getResources().getDrawable(R.drawable.mask);mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);//获取初始位置的时候,下方箭头所在的区域animEnabled = true; //同时,启动动画}//public void setChartClickListener(ChartClickListener l){//this.clickListener = l;//}//计算总和private int sum(int[] values){int sum = 0;for(int i=0; i= 360){//动画结束状态,停止绘制currentMaxDegree = 360;animState = ANIMATION_STATE_DOWN;animEnabled = false;}int[] degrees = getDegrees();        int startAngle = this.startDegree;               //获取当前时刻最大可以旋转的角度所位于的区域        int maxIndex = getEventPart(currentMaxDegree);               //根据不同的颜色画饼图        for(int i=0; i 0){        //注意,每次画饼图,记得计算startAngle        startAngle += degrees[i-1];        }               paint.setColor(colors[i]);            canvas.drawArc(OVAL, startAngle, currentDegree, true, paint);        }               if(animState == ANIMATION_STATE_DOWN){        //如果动画结束了,则调整当前箭头位于所在区域的中心方向        onStop();               }else{        postInvalidate();            }       }else{        int[] degrees = getDegrees();        int startAngle = this.startDegree;               /**         * 每个区域的颜色不同,但是这里只要控制好每个区域的角度就可以了,整个是个圆         */        for(int i=0; i0){        startAngle += degrees[i-1];        }        canvas.drawArc(OVAL, startAngle, degrees[i], true, paint);        }        }          /**     * 画出饼图之后,画遮罩图片,这样图片就位于饼图之上了,形成了遮罩的效果     */    canvas.drawBitmap(mask, 0, 0, maskPaint);       /**     * 根据当前计算得到的箭头所在区域显示该区域代表的信息     */    if(currentTargetIndex >= 0){    String title = titles[currentTargetIndex];    textPaint.setColor(colors[currentTargetIndex]);    //简单作个计算,让文字居中显示    int width = title.length()*17;    canvas.drawText(title, 157-width/2+3, 383, textPaint);    }    }        /**     * 处理饼图的转动     */    public boolean onTouchEvent(MotionEvent event){       if(animEnabled && animState == ANIMATION_STATE_RUNNING){    return super.onTouchEvent(event);    }       Point eventPoint = getEventAbsoluteLocation(event);    computeCenter(); //计算中心坐标       //计算当前位置相对于x轴正方向的角度    //在下面这个方法中计算了eventRadius的    int newAngle = getEventAngle(eventPoint, center);        int action = event.getAction();       switch (action) {case MotionEvent.ACTION_DOWN:lastEventPoint = eventPoint;if(eventRadius > getRadius()){        /**         * 只有点在饼图内部才需要处理转动,否则直接返回         */Log.e(TAG, "当前位置超出了半径:"+eventRadius+">"+getRadius());        return super.onTouchEvent(event);        }break;case MotionEvent.ACTION_MOVE://这里处理滑动rotate(eventPoint, newAngle);//处理之后,记得更新lastEventPointlastEventPoint = eventPoint;break;case MotionEvent.ACTION_UP:onStop();break;default:break;}       return true;    }            /**     * 当我们停止旋转的时候,如果当前下方箭头位于某个区域的非中心位置,则我们需要计算     * 偏移量,并且将箭头指向中心位置     */    private void onStop() {int targetAngle = getTargetDegree();currentTargetIndex = getEventPart(targetAngle);int offset = getOffsetOfPartCenter(targetAngle, currentTargetIndex);/*** offset>0,说明当前箭头位于中心位置右边,则所有区域沿着顺时针旋转offset大小的角度* offset= 360){    startDegree -= 360;    }else if(startDegree =0 && y=0){//左下方,返回180-anglerealDegree = 180-degree;}else{//右下方,直接返回realDegree = degree;}//Log.v(TAG, "当前事件相对于中心坐标x轴正方形的顺时针偏移角度为:"+realAngle);return realDegree;}/*** 获取当前下方箭头位置相对于startDegree的角度值* 注意,下方箭头相对于x轴正方向是90度* @return*/protected int getTargetDegree(){int targetDegree = -1;int tmpStart = startDegree;/*** 如果当前startAngle为负数,则直接+360,转换为正值*/if(tmpStart < 0){tmpStart += 360;}if(tmpStart < 90){/*** 如果startAngle小于90度(可能为负数)*/targetDegree = 90 - tmpStart;}else{/*** 如果startAngle大于90,由于在每次计算startAngle的时候,限定了其最大为360度,所以* 直接可以按照如下公式计算*/targetDegree = 360 + 90 - tmpStart;部分代码 百度知道限制字数 下载附件查看

如何在android studio 中实现圆饼图的转动

8. android柱状图展示问题

使用HorizontalScrollView, 内容width=wrap_content,试试
最新文章
热门文章
推荐阅读