一些强大的第三方控件

    1. PhotoView
    1. CutomShapeImageView
    1. MPAndroidChart

1. PhotoView

一个让图片随着收缩放大移动的类库,使用简单,缩放流畅.目前大部分app的缩放效果都是使用这个,
github地址:https://github.com/chrisbanes/PhotoView,其作者是Google官方Android工程师ChrisBane

原理:对ImageView添加OnTouchListener和GestureDecetor用来检查触摸移动的距离,以及双击事件,多点触摸的距离,
然后通过更改ImageView的Martrix来实现移动,缩放图片

用法如下:

  • 单独使用ImageView的时候,使用PhotoView替换掉ImageView即可:
PhotoView mPhotoView = new PhotoView(this);

  • 在ViewPager中使用的时候请使用HackyViewPager
public class HackyViewPager extends ViewPager {
private boolean isLocked;
public HackyViewPager(Context context) {
    super(context);
    isLocked = false;
}
public HackyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    isLocked = false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (!isLocked) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return false;
        }
    }
    return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    return !isLocked && super.onTouchEvent(event);
}
public void toggleLock() {
    isLocked = !isLocked;
}
public void setLocked(boolean isLocked) {
    this.isLocked = isLocked;
}
public boolean isLocked() {
    return isLocked;
}
}

2. CutomShapeImageView

特点:可让你的ImageView自定义形状,包括但不限于圆形,矩形,三角形,以及各种不规则图形,
github地址:https://github.com/MostafaGazar/CustomShapeImageView

原理:BaseImageView在onDraw方法中去首先绘制src图片,再绘制遮罩图片(maskBitmap),需要注意的是绘制遮罩图片时候使用的Xfermode为PorterDuff.Mode.DST_IN,即在2图交集区域取目标图片的内容;

遮罩图片通过getBitmap()方法获取,该方法由子类实现:CircleImageView的实现是返回一个圆形空白图片,RectangleImageView的实现是返回一个矩形空白图片,SvgImageView的实现是将svg格式的图片解析成bitmap;

SVG介绍:
全称为ScaleVectorGraphic,即可伸缩的矢量图;
特点:体积小,不会失真,通过xml描述,所以可以直接被文本编辑器来修改和查看; 属于W3C标准之一;
详情查看:http://blog.csdn.net/tianjian4592/article/details/44733123/

用法如下:

  • 使用CircleImageView,只需给src指定底图就行:
<com.meg7.widget.CircleImageView
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_marginLeft="16dp"
        android:src="@drawable/sample_2"
        android:scaleType="centerCrop">
  • 使用RectangleImageView,同样只需要指定src底图:
 <com.meg7.widget.RectangleImageView
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_marginLeft="16dp"
        android:src="@drawable/sample_3"
        android:scaleType="centerCrop" />
  • 使用SvgImageView,需要给它指定一张svg格式的图片资源:
<com.meg7.widget.SvgImageView
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_marginLeft="16dp"
        android:src="@drawable/sample_4"
        app:svg_raw_resource="@raw/shape_star"
        android:scaleType="centerCrop" />

3. MPAndroidChart

一个非常强大的用于数据统计展示的View,支持多样的折线图,柱状图,饼状图,网状图,点状图等等,基本上可以满足我们所有的需求,
github地址:https://github.com/PhilJay/MPAndroidChart

基类Chart继承ViewGroup,在onDraw基本没有做什么事;
有很多实现类,如LineChart(线状图),BarChart(柱状图),PieChart(饼状图)等,他们都重写了onDraw方法,并按照如下步骤绘制出内容:

//1.绘制背景
drawGridBackground(canvas);
//2.绘制X,y轴线
mXAxisRenderer.renderAxisLine(canvas);
mAxisRendererLeft.renderAxisLine(canvas);
mAxisRendererRight.renderAxisLine(canvas);
//3.绘制网格线
mXAxisRenderer.renderGridLines(canvas);
mAxisRendererLeft.renderGridLines(canvas);
mAxisRendererRight.renderGridLines(canvas);
//4.绘制图形数据,如绘制线,绘制柱形,绘制饼状
mRenderer.drawData(canvas);
//5.绘制单位标签
mXAxisRenderer.renderAxisLabels(canvas);
mAxisRendererLeft.renderAxisLabels(canvas);
mAxisRendererRight.renderAxisLabels(canvas)
//6.绘制图形的数值
mRenderer.drawValues(canvas);
//7.绘制mark标记
drawMarkers(canvas);
//8.绘制表格描述说明
drawDescription(canvas);

用法如下(只拿线状图,柱状图,饼状图举例):

    1. 如何使用线状图:
mChart = (LineChart) findViewById(R.id.line_chart);

//设置没有数据时候展示的文本
mChart.setNoDataText("目前木有数据哦");

//1.给Chart设置数据
mChart.setData(getLineData());

//2.设置y轴的取值范围
YAxis axisLeft = mChart.getAxisLeft();
//设置y轴最小值
axisLeft.setAxisMinValue(0);
//设置y轴最大值
axisLeft.setAxisMaxValue(50);

//3.设置去掉右边的y轴线
YAxis axisRight = mChart.getAxisRight();
axisRight.setEnabled(false);

//4.设置是否启用x轴线
XAxis xAxis = mChart.getXAxis();
xAxis.setEnabled(true);//显示x轴线

//5.设置表格描述信息
mChart.setDescription("表格描述");

//6.设置是否绘制表格背景
mChart.setDrawGridBackground(true);
//设置表格网格背景的颜色
//mChart.setGridBackgroundColor(Color.BLUE);

//7.设置绘制动画的时间
mChart.animateXY(3000,3000);

    1. 给线状图准备数据,需要构造LineDataSet,每一条线的数据就是一个LineDataSet对象, 该对象可以设置线的颜色,线条的标签,粗细等
public LineData getLineData() {
    int maxX = 10;
    List<Entry> entryList = new ArrayList<>();
    List<Entry> entryList2 = new ArrayList<>();
    for (int i=0;i<maxX; i++){
        //每个entry相当于线条上面的一个点
        Entry entry = new BarEntry(i*5,i);
        entryList.add(entry);

        Entry entry2 = new BarEntry(i*6+5,i);
        entryList2.add(entry2);
    }

    //创建LineDataSet对象,表示一条线的数据
    LineDataSet dataSet = new LineDataSet(entryList,"Line1");
    LineDataSet dataSet2 = new LineDataSet(entryList2,"Line2");

    //设置线条颜色和宽度
    dataSet.setLineWidth(4);
    dataSet.setColor(Color.RED);

    //
    //dataSet.setDrawCircleHole(false);//是否绘制空心圆
    //是否绘制圆形
    dataSet.setDrawCircles(false);//不绘制线条上面的圆

    //创建集合,存储所有线条数据对象
    List<ILineDataSet> list = new ArrayList<>();
    //存放一条线的数据
    list.add(dataSet);
    list.add(dataSet2);

    //生成x轴的数据
    List<String> xVals = ChartData.generateXVals(0, maxX);
    LineData lineData = new LineData(xVals,list);

    return lineData;
}

    1. 如何使用柱状图:
//创建条形数据对象
BarChart barChart = new BarChart(this);
setContentView(barChart);

//设置条形数据
barChart.setData(getBarData());

//设置描述
barChart.setDescription("2016行业薪资比较");

//设置绘制bar的阴影
barChart.setDrawBarShadow(true);

//设置绘制的动画时间
barChart.animateXY(3000,3000);

    1. 如何给柱状图设置数据,主要是构造BarDataSet对象,它需要一个装有BarEntry的集合, 每一个柱形都是一个BarEntry:
public BarData getBarData() {
int maxX = 10;

//创建集合,存放每个柱子的数据
List<BarEntry> list = new ArrayList<>();
List<BarEntry> list2 = new ArrayList<>();
for (int i=0;i<maxX;i++){
    //一个BarEntry就是一个柱子的数据对象
    BarEntry barEntry = new BarEntry(i+5,i);
    list.add(barEntry);

    BarEntry barEntry2 = new BarEntry(i+3,i);
    list2.add(barEntry2);
}

//创建BarDateSet对象,其实就是一组柱形数据
BarDataSet barSet = new BarDataSet(list,"Android");
BarDataSet barSet2 = new BarDataSet(list2,"iOS");

//设置柱形的颜色
barSet.setColor(Color.BLUE);
//设置是否显示柱子上面的数值
barSet.setDrawValues(false);
//设置柱子阴影颜色
barSet.setBarShadowColor(Color.GRAY);

//创建集合,存放所有组的柱形数据
List<IBarDataSet> dataSets = new ArrayList<>();
dataSets.add(barSet);
dataSets.add(barSet2);

BarData barData = new BarData(ChartData.generateXVals(0,maxX),dataSets);
return barData;

  • 5 如何使用饼状图:
PieChart pieChart = new PieChart(this);
setContentView(pieChart);

//设置饼状图数据
pieChart.setData(getPieData());

//设置描述
pieChart.setDescription("胡萝卜维生素成分比例");
pieChart.setDescriptionTextSize(20);

//设置中心说明文字
pieChart.setCenterText("中心说明文字");
pieChart.setCenterTextSize(20);
pieChart.setCenterTextColor(Color.RED);

pieChart.animateXY(3000,3000);

  • 6 如何给饼状图设置数据,主要构造PieData对象,它需要一个PieDataSet对象,set对象是装满Entry的集合,封装的是饼状百分比和位置的映射:

public PieData getPieData() {
    ArrayList<Entry> list = new ArrayList<>();
    for (int i=0;i<3;i++){
        //一个Entry就是一个饼块
        Entry entry = new Entry(i+2,i);
        list.add(entry);
    }

    //创建一组饼块的数据
    PieDataSet pieDataSet = new PieDataSet(list,"标签");

    //设置饼块的间距
    pieDataSet.setSliceSpace(4);
    //设置饼快颜色
    pieDataSet.setColors(new int[]{Color.RED,Color.GREEN,Color.BLUE});

    //创建x轴
    ArrayList<String> xList = new ArrayList<>();
    xList.add("维生素A");
    xList.add("维生素B");
    xList.add("维生素C");

    PieData pieData = new PieData(xList,pieDataSet);
    return pieData;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容