Android 绘制线段Line Segment

合集下载

Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)标签:图形androidpathfloatclass2012-01-20 20:02 151861人阅读评论(64) 收藏举报分类:android(12)版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+] 1、首先说一下canvas类:Class OverviewThe Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).这个类相当于一个画布,你可以在里面画很多东西;我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。

也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。

这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。

两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。

AndroidLineChart绘制多条曲线的方法

AndroidLineChart绘制多条曲线的方法

AndroidLineChart绘制多条曲线的⽅法本⽂实例为⼤家分享了Android LineChart绘制多条曲线的具体代码,供⼤家参考,具体内容如下⽬标效果:1.新建custom_marker_view.xml页⾯作为点击弹出框的页⾯:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android" android:layout_width="wrap_content"android:layout_height="40dp"android:background="@drawable/marker2" ><TextViewandroid:id="@+id/tvContent"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="7dp"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:text=""android:textSize="12dp"android:textColor="@android:color/white"android:ellipsize="end"android:singleLine="true"android:textAppearance="?android:attr/textAppearanceSmall" /></RelativeLayout>2.activity_main.xml页⾯:<RelativeLayout xmlns:android="/apk/res/android" xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="10dp"android:paddingLeft="10dp"android:paddingRight="10dp"android:paddingTop="10dp"tools:context=".MainActivity" ><com.github.mikephil.charting.charts.LineChartandroid:id="@+id/chartTall"android:layout_width="match_parent"android:layout_height="400dp"android:layout_marginTop="20dp" /></RelativeLayout>3.新建MyMarkerView.java重写MarkView控件:package com.example.weixu.drawline;import android.content.Context;import android.widget.TextView;import com.github.mikephil.charting.data.CandleEntry;import com.github.mikephil.charting.data.Entry;import com.github.mikephil.charting.utils.MarkerView;import com.github.mikephil.charting.utils.Utils;public class MyMarkerView extends MarkerView {private TextView tvContent;public MyMarkerView(Context context, int layoutResource) {super(context, layoutResource);tvContent = (TextView) findViewById(Content);}@Overridepublic void refreshContent(Entry e, int dataSetIndex) {if (e instanceof CandleEntry) {CandleEntry ce = (CandleEntry) e;tvContent.setText("" + Utils.formatNumber(ce.getHigh(), 0, true));} else {tvContent.setText("" +e.getVal());}}}4.MainActivity.java页⾯:package com.example.weixu.drawline;import java.util.ArrayList;import android.app.Activity;import android.graphics.Color;import android.graphics.Typeface;import android.os.Bundle;import android.view.WindowManager;import com.github.mikephil.charting.charts.BarLineChartBase;import com.github.mikephil.charting.charts.BarLineChartBase.BorderPosition; import com.github.mikephil.charting.charts.LineChart;import com.github.mikephil.charting.data.Entry;import com.github.mikephil.charting.data.LineData;import com.github.mikephil.charting.data.LineDataSet;import com.github.mikephil.charting.utils.Legend;import com.github.mikephil.charting.utils.Legend.LegendForm;import com.github.mikephil.charting.utils.XLabels;import com.github.mikephil.charting.utils.XLabels.XLabelPosition;import com.github.mikephil.charting.utils.YLabels;public class MainActivity extends Activity {private LineChart chartTall;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);setContentView(yout.activity_main);chartTall = (LineChart) findViewById(R.id.chartTall);setType();// 刷新图表chartTall.invalidate();}private void setType() {// 设置在Y轴上是否是从0开始显⽰chartTall.setStartAtZero(true);//是否在Y轴显⽰数据,就是曲线上的数据chartTall.setDrawYValues(true);//设置⽹格chartTall.setDrawBorder(true);chartTall.setBorderPositions(new BarLineChartBase.BorderPosition[] {BorderPosition.BOTTOM});//在chart上的右下⾓加描述chartTall.setDescription("⾝⾼曲线图");//设置Y轴上的单位chartTall.setUnit("cm");//设置透明度chartTall.setAlpha(0.8f);//设置⽹格底下的那条线的颜⾊chartTall.setBorderColor(Color.rgb(213, 216, 214));//设置Y轴前后倒置chartTall.setInvertYAxisEnabled(false);//设置⾼亮显⽰chartTall.setHighlightEnabled(true);//设置是否可以触摸,如为false,则不能拖动,缩放等chartTall.setTouchEnabled(true);//设置是否可以拖拽,缩放chartTall.setDragEnabled(true);chartTall.setScaleEnabled(true);//设置是否能扩⼤扩⼩chartTall.setPinchZoom(true);//设置点击chart图对应的数据弹出标注MyMarkerView mv = new MyMarkerView(this, yout.custom_marker_view);mv.setOffsets(-mv.getMeasuredWidth() / 2, -mv.getMeasuredHeight());chartTall.setMarkerView(mv);chartTall.setHighlightIndicatorEnabled(false);//设置字体格式,如正楷Typeface tf = Typeface.createFromAsset(getAssets(),"OpenSans-Regular.ttf");chartTall.setValueTypeface(tf);XLabels xl = chartTall.getXLabels();xl.setPosition(XLabelPosition.BOTTOM); // 设置X轴的数据在底部显⽰xl.setTypeface(tf); // 设置字体xl.setTextSize(10f); // 设置字体⼤⼩xl.setSpaceBetweenLabels(3); // 设置数据之间的间距YLabels yl = chartTall.getYLabels();yl.setTypeface(tf); // 设置字体yl.setTextSize(10f); // s设置字体⼤⼩yl.setLabelCount(5); // 设置Y轴最多显⽰的数据个数// 加载数据setData();//从X轴进⼊的动画chartTall.animateX(4000);chartTall.animateY(3000); //从Y轴进⼊的动画chartTall.animateXY(3000, 3000); //从XY轴⼀起进⼊的动画//设置最⼩的缩放chartTall.setScaleMinima(0.5f, 1f);}private void setData() {String[] babAge = {"0","1","2","3","4","5","6"}; //连线的x轴数据String[] babyTall = {"50","60","90","110","130","135","140"};String[] usuaTall = {"55","65","95","115","125","135","145"};//连线的y轴数据LineData data=new LineData(babAge,setLine(babAge,babyTall,1,"宝宝⾝⾼")); //创建LineData实体类并添加第⼀条曲线 data.addDataSet(setLine(babAge,usuaTall,2,"正常⾝⾼")); //添加第⼆条曲线chartTall.setData(data);}//画线private LineDataSet setLine(String[] babAge, String[] Tall,int flag,String name) {ArrayList<String> xValsAge = new ArrayList<String>();for (int i = 0; i < babAge.length; i++) {xValsAge.add(babAge[i]);}ArrayList<Entry> yValsBabyTall = new ArrayList<Entry>();for (int i = 0; i < Tall.length; i++) {yValsBabyTall.add(new Entry(Float.parseFloat(Tall[i]), i));}//设置baby的成长曲线LineDataSet setData = new LineDataSet(yValsBabyTall,name);setData.setDrawCubic(true); //设置曲线为圆滑的线setData.setCubicIntensity(0.2f);setData.setDrawFilled(false); //设置包括的范围区域填充颜⾊setData.setDrawCircles(true); //设置有圆点setData.setLineWidth(2f); //设置线的宽度setData.setCircleSize(5f); //设置⼩圆的⼤⼩setData.setHighLightColor(Color.rgb(244, 117, 117));//设置曲线颜⾊if(flag==1)setData.setColor(Color.rgb(104, 241, 175)); //宝宝⾝⾼曲线颜⾊else if(flag==2)setData.setColor(Color.rgb(255, 0, 0)); //普通⾝⾼曲线颜⾊return setData; //返回曲线}}源码:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

android 绘制图形(线段,圆,矩形等)

android 绘制图形(线段,圆,矩形等)

android 绘制图形(线段,圆,矩形等)1. 创建一个你自己的MyView 让他继承 View类实现onDraw 方法 这是主要的。

Java代码1.packagecom.wljie;2.3.importandroid.content.Context;4.5.importandroid.graphics.Canvas;6.7.importandroid.graphics.Color;8.9.importandroid.graphics.Paint;10.11.importandroid.view.View;12.13.publicclassMyViewextendsView{14.15.publicMyView(Contextcontext){16.17.super(context);18.19.//TODOAuto-generatedconstructorstub20.21.}22.23.@Override24.25.protectedvoidonDraw(Canvascanvas){26.27.super.onDraw(canvas);28.29.canvas.drawColor(Color.WHITE);30.31.Paintpaint=newPaint();//实例化paint类32.33.paint.setAntiAlias(true);//设置去锯齿34.35.paint.setColor(Color.RED);//设置paint的颜色是红色的36.37.paint.setStyle(Paint.Style.STROKE);//设置为空心的38.39.canvas.drawLine(0,0,100,100,paint);//划一条线段40.41.canvas.drawCircle(200,200,50,paint);//划一个空心圆42.43.}44.45.}2. 在activity 实例华这个类Java代码1.packagecom.wljie;2.3.importandroid.app.Activity;4.5.importandroid.graphics.Paint;6.7.importandroid.os.Bundle;8.9.importandroid.widget.Button;10.11.importandroid.widget.LinearLayout;12.13.publicclassMainextendsActivity{14.15./**Calledwhentheactivityisfirstcreated.*/16.17.18.@Override19.20.publicvoidonCreate(BundlesavedInstanceState){21.22.super.onCreate(savedInstanceState);23.24.//setContentView(yout.main);25.26.MyViewmyView=newMyView(this);27.28.setContentView(myView);29.30.}31.32.}图形的绘制在Android 中象图标的制作如:并行图,直方图用的比较多。

Android绘制图形(转)学习

Android绘制图形(转)学习

Android绘制图形(转)学习以前的⽂章⾥边画⼀般都是⼀些矩形,今天就看看怎么在android⼿机屏幕上绘制⼀些⼏何图形,如三⾓形、多边形、椭圆、圆形、正⽅形等等。

并且设置空⼼、实⼼。

下⾯我们先来看看在android中可以绘制出那些⼏何图形[color=#008000] ⽅法说明drawRect 绘制矩形drawCircle 绘制圆形drawOval 绘制椭圆drawPath 绘制任意多边形drawLine 绘制直线drawPoin 绘制点[/color]我们先来看看效果图吧:[align=center][/align][align=left] 下⾯我们就来看看代码是怎么做的:[/align][align=left][b]Java代码:[/b][/align][code]<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"android:textColor="#00FF00"/><xiaohang.zhimeng.GameViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>[/code][b]Java代码:[/b][code]package eoe.demo;import android.app.Activity;import android.os.Bundle;public class Activity01 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);}}[/code]GameView[b]Java代码:[/b][code]package eoe.demo;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;public class GameView extends View implements Runnable {// 声明Paint对象private Paint mPaint = null;private GameView2 mGameView2 = null;public GameView(Context context, AttributeSet attr){super(context,attr);System.out.println(1);// 构建画笔对象mPaint = new Paint();mGameView2 = new GameView2(context);// 开启线程new Thread(this).start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 设置画布为⿊⾊背景canvas.drawColor(Color.BLACK);// 取消锯齿mPaint.setAntiAlias(true);// 设置画笔风格为空⼼mPaint.setStyle(Paint.Style.STROKE);{// 定义矩形对象Rect rect1 = new Rect();// 设置矩形⼤⼩rect1.left = 5;rect1.top = 5;rect1.bottom = 25;rect1.right = 45;mPaint.setColor(Color.BLUE);// 绘制矩形canvas.drawRect(rect1, mPaint);mPaint.setColor(Color.RED);// 绘制矩形canvas.drawRect(50, 5, 90, 25, mPaint);mPaint.setColor(Color.YELLOW);// 绘制圆形// 40 70 分别是圆⼼的X 和 Y坐标 30为半径 mPaint为画笔对象canvas.drawCircle(40, 70, 30, mPaint);// 定义椭圆RectF rectf1 = new RectF();rectf1.left = 80;rectf1.top = 30;rectf1.right = 120;rectf1.bottom = 70;mPaint.setColor(Color.LTGRAY);// 绘制椭圆canvas.drawOval(rectf1, mPaint);// 绘制多边形Path path1 = new Path();/*** 这个多变形我也没试验它到底是怎么画应该就是从起点找点⼀个点⼀个点的连线*/path1.moveTo(150 + 5, 80 - 50); // 此点为多边形的起点path1.lineTo(150 + 45, 80 - 50);path1.lineTo(150 + 30, 120 - 50);path1.lineTo(150 + 20, 120 - 50);// 使这些点构成封闭的多边形path1.close();mPaint.setColor(Color.GRAY);// 绘制这个多边形canvas.drawPath(path1, mPaint);mPaint.setColor(Color.RED);// 设置画笔空⼼边框的宽度mPaint.setStrokeWidth(3);// 绘制直线// 这个绘制直线的⽅法前2个参数是前点坐标后 2个参数是终点坐标我们可看出两个点的Y坐标都⼀样的canvas.drawLine(5, 110, 315, 110, mPaint);}// 绘制实⼼⼏何体// 将画笔设置为实⼼mPaint.setStyle(Paint.Style.FILL);{// 定义矩形Rect rect1 = new Rect();rect1.left = 5;rect1.top = 130 + 5;rect1.bottom = 130 + 25;rect1.right = 45;mPaint.setColor(Color.BLUE);// 绘制矩形canvas.drawRect(rect1, mPaint);mPaint.setColor(Color.RED);// 绘制矩形canvas.drawRect(50, 130 + 5, 90, 130 + 25, mPaint);mPaint.setColor(Color.YELLOW);// 绘制圆形这⾥参数就不说明了上边已经说了canvas.drawCircle(40, 130 + 70, 30, mPaint);// 定义椭圆对象RectF rectf1 = new RectF();// 设置椭圆⼤⼩rectf1.left = 80;rectf1.top = 130+30;rectf1.right = 120;rectf1.bottom = 130 + 70;mPaint.setColor(Color.LTGRAY);// 绘制椭圆canvas.drawOval(rectf1, mPaint);// 绘制多边形Path path1 = new Path();// 设置多边形的点path1.moveTo(150+5, 130+80-50);path1.lineTo(150+45, 130+80-50);path1.lineTo(150+30, 130+120-50);path1.lineTo(150+20, 130+120-50);// 使这些点构成封闭的多边形path1.close();mPaint.setColor(Color.GRAY);// 绘制这个多边形canvas.drawPath(path1, mPaint);mPaint.setColor(Color.RED);mPaint.setStrokeWidth(3);// 绘制直线canvas.drawLine(5, 130 + 110, 315, 130 + 110, mPaint);}// 通过ShapDrawable来绘制⼏何图形mGameView2.DrawShape(canvas);}@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 使⽤postInvalidate可以直接在线程中更新界⾯postInvalidate();}}}[/code]在android中还可以通过ShapDrawable来绘制图像,ShapDrawable可以设置画笔的形状。

android画路线

android画路线

问题描述:使用成百上千个GPS坐标画路线,在android上的Google Map显示出来之前我实现过一次,将每个点都遍历一边,然后在Google Map上画出来,但是由于数据过多导致Google地图移动位置变得不流畅,每次移动Google地图都会调用draw 方法,那么程序一直遍历一直画图,花费大且不流畅。

这次做了下优化,对只在屏幕内的坐标画线。

Google地图比之前流畅多了。

之前实现是画蓝色的线,这次实现只画红色的线。

临界条件是上一个点在屏幕内,下一个点在屏幕外。

运行环境:android版本2.3Java代码package com.ui;import java.util.ArrayList;import java.util.List;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Path;import android.util.Log;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import com.google.android.maps.Projection;import com.model.Point;public class RouteOverlay extends Overlay{final static String TAG = "DrawRoutePath";private List<Point> points = new ArrayList<Point>();private final Projection projection;private final Paint paint;public RouteOverlay(Projection projection) {this.projection = projection;// 设置画笔paint = new Paint();paint.setColor(Color.RED);// 画笔的粗细paint.setStrokeWidth(3);paint.setAntiAlias(true);paint.setStrokeMiter(3);paint.setStyle(Style.STROKE);}@Overridepublic void draw(Canvas canvas, MapView mapV iew, boolean shadow) { super.draw(canvas, mapV iew, shadow);if(shadow){return;}// 这里使用系统提供的Path,Point来画图Path drawingPath = new Path();android.graphics.Point pixelPoint = new android.graphics.Point();// 得到当前屏幕的高*宽int width = canvas.getWidth();int height = canvas.getHeight();GeoPoint bottomRight = projection.fromPixels(width, height);GeoPoint topLeft = projection.fromPixels(0, 0);int maxLat = topLeft.getLatitudeE6();int minLat = bottomRight.getLatitudeE6();int minLon = topLeft.getLongitudeE6();int maxLon = bottomRight.getLongitudeE6();int pointsSize = points.size();// 之前的布点是否在屏幕中boolean preOutOfBounds = true;// 之前的布点是否是新的一段路线的开始boolean preWasMoveTo = true;int moveToLat = Integer.MAX_V ALUE;int moveToLon = Integer.MIN_V ALUE;for(int i=0; i<pointsSize; i++){double pointLat = points.get(i).getLat();int pointLatInt = (int)(pointLat * 1E6);double pointLon = points.get(i).getLon();int pointLonInt = (int)(pointLon * 1E6);// 判断该点有没有超出屏幕显示的范围boolean currentOutOfBounds = pointLatInt < minLat || pointLatInt > maxLat || pointLonInt < minLon || pointLonInt > maxLon;// 起点或者先前节点和当前节点都在屏幕之外,将preWasMoveTo设为true‘// 当前坐标在屏幕外,并且之前坐标也在屏幕外,则设置preWasMoveTo为true if(i == 0 || (preOutOfBounds && currentOutOfBounds)){moveToLat = pointLatInt;moveToLon = pointLonInt;preWasMoveTo = true;}else{if(preWasMoveTo){GeoPoint geoPoint = new GeoPoint(moveToLat, moveToLon);// 将经纬度转换为屏幕画布像素上的点(称之为布点)projection.toPixels(geoPoint, pixelPoint);// 设置point.x, point.y为新一段路线的开始drawingPath.moveTo(pixelPoint.x, pixelPoint.y);preWasMoveTo = false;}GeoPoint geoPoint = new GeoPoint(pointLatInt, pointLonInt);projection.toPixels(geoPoint, pixelPoint);// 将最后的布点与该布点之间画一条线drawingPath.lineTo(pixelPoint.x, pixelPoint.y);}preOutOfBounds = currentOutOfBounds;}canvas.drawPath(drawingPath, paint);}public void setPoints(ArrayList<Point> points) {this.points = points;}}我的博客/blog/1300662。

android 画虚线、实线,画圆角矩形,一半圆角

android 画虚线、实线,画圆角矩形,一半圆角

android 画虚线、实线,画圆角矩形,一半圆角建立dotted_line_gray.xml文件放在drawable文件夹下面。

android:shape="line" 可以修改你想要的形状<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"android:shape="line"><!-- 显示一条虚线,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线 --><stroke android:width="1dp" android:color="#D5D5D5"android:dashWidth="2dp" android:dashGap="3dp" /><!-- 虚线的高度--><size android:height="2dp" /></shape>然后在布局的xml里面:作为ImageView或者Linearlayout等作为背景源就可以了。

<LinearLayoutandroid:id="@+id/activity_line"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginLeft="5dip"android:layout_marginRight="5dip"android:background="@drawable/dotted_line_gray" />---------2、画圆角矩形建立rect_gray.xml文件放在drawable文件夹下面。

AndroidGIS开发系列--入门季(3)GraphicsLayer添加点、线、面

AndroidGIS开发系列--入门季(3)GraphicsLayer添加点、线、面

AndroidGIS开发系列--⼊门季(3)GraphicsLayer添加点、线、⾯GraphicsLayer是图形图层,可以⾃定义图形添加到地图上。

调⽤GraphicsLayer的addGraphic⽅法就能添加图形,此⽅法要⼀个Graphic对象,此对象的构造⽅法是Graphic(Geometry geometry, Symbol symbol),前⾯第⼀个是要素,⽽Geometry的⼦类有Envelope, MultiPath, MultiPoint, Point, Segment,Line, Polygon, Polyline。

我们所常⽤的有点Point,线Polyline,⾯Polygon。

⽽后⾯⼀个参数是样式,点的样式是SimpleMarkerSymbol,线的样式是SimpleLineSymbol,⾯的样式是SimpleFillSymbol。

⼀、GraphicsLayer添加点:1. Graphic graphic = new Graphic(point, new SimpleMarkerSymbol(Color.RED,5, SimpleMarkerSymbol.STYLE.CIRCLE));2. graphicsLayer.addGraphic(graphic);⼆、添加线,样式有实线、虚线、点虚线、点点虚线、点线等。

效果图如下:1. Polyline polyline = new Polyline();2. polyline.startPath(new Point(113,23));//第⼀个点⽤startPath,后⾯的点⽤lineTo⽅法3. polyline.lineTo(new Point(123,23));4. graphic = new Graphic(polyline,new SimpleLineSymbol(Color.RED,3, SimpleLineSymbol.STYLE.SOLID));5. graphicsLayer.addGraphic(graphic);三、添加⾯Polygon,效果图如下:1. Polygon polygon = new Polygon();2. //第⼀个点startPath,后⾯的点⽤lineTo3. polygon.startPath(new Point(118,23));4. polygon.lineTo(new Point(118,15));5. polygon.lineTo(new Point(113,13));6.7. graphic = new Graphic(polygon,new SimpleFillSymbol(Color.GREEN,SimpleFillSymbol.STYLE.SOLID));8. graphicsLayer.addGraphic(graphic);Code for all:1. package com.arcgis.test;2.3. import android.graphics.Color;4. import android.os.Bundle;5. import android.support.annotation.Nullable;6. import android.support.v7.app.AppCompatActivity;7. import android.view.View;8. import android.widget.AdapterView;9. import android.widget.Button;10. import android.widget.Spinner;11. import com.esri.android.map.GraphicsLayer;12. import com.esri.android.map.MapView;13. import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;14. import com.esri.android.map.event.OnSingleTapListener;15. import com.esri.core.geometry.Point;16. import com.esri.core.geometry.Polygon;17. import com.esri.core.geometry.Polyline;18. import com.esri.core.map.Graphic;19. import com.esri.core.symbol.SimpleFillSymbol;20. import com.esri.core.symbol.SimpleLineSymbol;21. import com.esri.core.symbol.SimpleMarkerSymbol;22. import java.util.ArrayList;23. import java.util.List;24.25.26. public class GraphicActivity extends AppCompatActivity {27.28. private MapView mMapView;29. private Spinner graphicTypeSpinner;30. private Button clernBtn;31. private ArcGISTiledMapServiceLayer arcGISTiledMapServiceLayer;32. private GraphicsLayer graphicsLayer;33. private String mapServerUrl = "/ArcGIS/rest/services/World_Street_Map/MapServer";34. //点集合35. private List<Point> pointList = new ArrayList<>();36.37. private Graphic graphic;38.39. @Override40. protected void onCreate(@Nullable Bundle savedInstanceState) {41. super.onCreate(savedInstanceState);42. setContentView(yout.activity_graphic);43. initView();44. addLayer();45. }46.47. private void initView() {48. mMapView = (MapView) findViewById(R.id.map_view);49. //mapview点击事件50. mMapView.setOnSingleTapListener(new OnSingleTapListener() {51. @Override52. public void onSingleTap(float x, float y) {53. handleSingleTap(x, y);54. }55. });56.57. graphicTypeSpinner = (Spinner) findViewById(R.id.spinner_type);58. graphicTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {59. @Override60. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {61. pointList.removeAll(pointList);62. graphicsLayer.removeAll();63. }64.65. @Override66. public void onNothingSelected(AdapterView<?> parent) {67.68. }69. });70.71. clernBtn = (Button) findViewById(R.id.clear_graphic);72. clernBtn.setOnClickListener(new View.OnClickListener() {73. @Override74. public void onClick(View v) {75. pointList.removeAll(pointList);76. graphicsLayer.removeAll();77. }78. });79.80.81. }82.83.84. private void addLayer() {85. arcGISTiledMapServiceLayer = new ArcGISTiledMapServiceLayer(mapServerUrl);86. mMapView.addLayer(arcGISTiledMapServiceLayer);87.88. graphicsLayer = new GraphicsLayer();89. mMapView.addLayer(graphicsLayer);90. }91.92.93. private void handleSingleTap(float x, float y) {94. Point point = mMapView.toMapPoint(x, y);95. graphicsLayer.removeAll();96. pointList.add(point);97. String type = graphicTypeSpinner.getSelectedItem().toString().trim();98. switch (type) {99. case "点":100. graphic = new Graphic(point, new SimpleMarkerSymbol(Color.RED,5, SimpleMarkerSymbol.STYLE.CIRCLE)); 101. graphicsLayer.addGraphic(graphic);102. break;103. case "线":104. Polyline polyline = new Polyline();105. if (pointList.size()>1){106. for(int i=0;i<pointList.size();i++){107. if (i==0){108. polyline.startPath(pointList.get(i));109. }else{110. polyline.lineTo(pointList.get(i));111. }112. }113. }114. graphic = new Graphic(polyline,new SimpleLineSymbol(Color.RED,3, SimpleLineSymbol.STYLE.SOLID)); 115. graphicsLayer.addGraphic(graphic);116. break;117. case "⾯":118. Polygon polygon = new Polygon();119. for(int i=0;i<pointList.size();i++){120. if (i==0){121. polygon.startPath(pointList.get(i));122. }else{123. polygon.lineTo(pointList.get(i));124. }125. }126. graphic = new Graphic(polygon,new SimpleFillSymbol(Color.GREEN,SimpleFillSymbol.STYLE.SOLID)); 127. graphicsLayer.addGraphic(graphic);128. break;129. }130. }131. }。

Android原生绘图工具Canvas详细

Android原生绘图工具Canvas详细

Android原⽣绘图⼯具Canvas详细⽬录1.Canvas提供的绘制函数2.绘制背景3.绘制矩形drawRect4.绘制圆⾓矩形drawRoundRect5.绘制圆形drawCircle6.绘制路径drawPath7.绘制直线drawLine8.绘制圆弧drawArc9.绘制椭圆drawOval10.绘制点drawPoint11.绘制⽂本drawText 沿路径绘制⽂本drawTextOnPath12.绘制bitmap drawBitmap如果对上⼀篇感兴趣的话可以看看下⾯步⼊正题:先看看效果图1.Canvas提供的绘制函数canvas.drawColor();canvas.drawRGB();canvas.drawRect();canvas.drawRoundRect();canvas.drawCircle();canvas.drawPath();canvas.drawLine();canvas.drawArc();canvas.drawOval();canvas.drawPoint();canvas.drawPoints();canvas.drawText();canvas.drawTextOnPath();canvas.drawBitmap();2.绘制背景⽤于初始化和清空画布//绘制颜⾊,默认模式public void drawColor(@ColorInt int color) {super.drawColor(color);}//颜⾊绘制,设置modepublic void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) {super.drawColor(color, mode);}//参数0-255public void drawARGB(int a, int r, int g, int b) {super.drawARGB(a, r, g, b);}//参数0-255public void drawRGB(int r, int g, int b) {super.drawRGB(r, g, b);}第⼆个函数中⽤到PorterDuff.Mode,PorterDuff.Mode主要⽤于图像混合模式,后⾯细说//传⼊RectFpublic void drawRect(@NonNull RectF rect, @NonNull Paint paint) {super.drawRect(rect, paint);}//传⼊Rectpublic void drawRect(@NonNull Rect r, @NonNull Paint paint) {super.drawRect(r, paint);}//把Rect的四个点坐标传⼊public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) {super.drawRect(left, top, right, bottom, paint);}Rect 和RectF都是提供⼀个矩形局域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1Android 绘制线段Line Segment
创建一个DrawLine Activity,定义四个顶点:
Java代码:
float vertexArray[] = {
2-0.8f, -0.4f * 1.732f, 0.0f,
3-0.4f, 0.4f * 1.732f, 0.0f,
40.0f, -0.4f * 1.732f, 0.0f,
50.4f, 0.4f * 1.732f, 0.0f,
6};
复制代码
分别以三种模式GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP 来绘制直线:
java代码:
7public void DrawScene(GL10 gl) {
8super.DrawScene(gl);
9
10ByteBuffer vbb= ByteBuffer.allocateDirect(vertexArray.length*4);
11vbb.order(ByteOrder.nativeOrder());
12FloatBuffer vertex = vbb.asFloatBuffer();
13vertex.put(vertexArray);
14vertex.position(0);
15
16gl.glLoadIdentity();
17gl.glTranslatef(0, 0, -4);
18
19gl.glEnableClientState(GL10.GL_VERTEX_ARRA Y);
20
21gl.glVertexPointer(3, GL10.GL_FLOA T, 0, vertex);
22index++;
23index%=10;
24switch(index){
25case 0:
26case 1:
27case 2:
28gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
29gl.glDrawArrays(GL10.GL_LINES, 0, 4);
30break;
31case 3:
32case 4:
33case 5:
34gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
35gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 4);
36break;
37case 6:
38case 7:
39case 8:
40case 9:
41gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
42gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
43break;
44}
45
46gl.glDisableClientState(GL10.GL_VERTEX_ARRA Y);
47
48}
复制代码
这里index 的目的是为了延迟一下显示(更好的做法是使用固定时间间隔)。

前面说过GLSurfaceView 的渲染模式有两种,一种是连续不断的更新屏幕,另一种为on-demand ,只有在调用requestRender() 在更新屏幕。

缺省为RENDERMODE_CONTINUOUSLY持续刷新屏幕。

OpenGLDemos 使用的是缺省的RENDERMODE_CONTINUOUSLY持续刷新屏幕,因此Activity的drawScene 会不断的执行。

本例中屏幕上顺序以红,绿,蓝色显示LINES, LINE_STRIP,LINE_LOOP。

相关文档
最新文档