Android简明开发教程十五:RadioButton 多边形及路径绘制

jerry Android 2017年06月29日 收藏

这个例子是绘制多边形,多义形和路径,采用单选钮RadioButton来选择Polys 和Path示例:

UI 设计为 上部分用来显示绘图内容,下部分为两个单选按钮 Polys ,Path。这样layout就和main.xml 不一样,main.xml只含一个com.pstreets.graphics2d.GuidebeeGraphics2DView。因此需在res\layout下新建一个polys.xml:

  1. <?xml version=”1.0 encoding=”utf-8″?>
  2. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3. android:orientation=”vertical”
  4. android:background=”@drawable/white”
  5. android:layout_width=”fill_parent”
  6. android:layout_height=”fill_parent”>
  7. <com.pstreets.graphics2d.GuidebeeGraphics2DView
  8. android:id=”@+id/graphics2dview”
  9. android:layout_weight=”1″
  10. android:layout_width=”fill_parent”
  11. android:layout_height=”wrap_content”/>
  12. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  13. android:layout_width=”wrap_content” android:layout_height=”wrap_content”
  14. android:orientation=”horizontal”
  15.  
  16. >
  17. <RadioGroup
  18. android:layout_width=”wrap_content”
  19. android:orientation=”horizontal”
  20. android:textSize=”20dp”
  21. android:layout_height=”wrap_content”>
  22. <RadioButton android:text=”Polys”
  23. android:id=”@+id/radioPolys”
  24. android:layout_width=”wrap_content”
  25. android:textColor=”@color/black”
  26. android:checked=”true”
  27. android:layout_height=”wrap_content”>
  28. </RadioButton>
  29. <RadioButton android:text=”Path”
  30. android:id=”@+id/radioPath”
  31. android:layout_width=”wrap_content”
  32. android:textColor=”@color/black”
  33. android:layout_height=”wrap_content”>
  34. </RadioButton>
  35. </RadioGroup>
  36. </LinearLayout>
  37. </LinearLayout>

RadioButton 需包含在RadioGroup中做为一个分组,这里将Polys 设为选中。

定义好Layout资源后,修改 Path.java

  1. private RadioButton radioPoly;
  2. private RadioButton radioPath;
  3.  
  4. public void onCreate(Bundle savedInstanceState) {
  5.  super.onCreate(savedInstanceState);
  6.  setContentView(R.layout.polys);
  7.  graphic2dView
  8.   = (GuidebeeGraphics2DView)
  9.     findViewById(R.id.graphics2dview);
  10.  radioPath = (RadioButton) findViewById(R.id.radioPath);
  11.  radioPoly = (RadioButton) findViewById(R.id.radioPolys);
  12.  radioPath.setOnClickListener(this);
  13.  radioPoly.setOnClickListener(this);
  14. }

应为需要处理按键消息,所以定义了两个RadioButton对象,可以通过findViewById获取实例。因为两个RadioButton这里采用同样的处理方法,可以让Path实现OnClickListener ,即:public class Path extends Graphics2DActivity   implements OnClickListener。完整代码如下:

  1. public class Path extends Graphics2DActivity
  2. implements OnClickListener {
  3.  
  4. private RadioButton radioPoly;
  5. private RadioButton radioPath;
  6.  
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.polys);
  10. graphic2dView
  11. = (GuidebeeGraphics2DView)
  12. findViewById(R.id.graphics2dview);
  13. radioPath = (RadioButton) findViewById(R.id.radioPath);
  14. radioPoly = (RadioButton) findViewById(R.id.radioPolys);
  15. radioPath.setOnClickListener(this);
  16. radioPoly.setOnClickListener(this);
  17. }
  18.  
  19. @Override
  20. protected void drawImage() {
  21. if (radioPoly.isChecked()) {
  22. drawPolys();
  23. } else {
  24. drawPaths();
  25. }
  26. graphic2dView.refreshCanvas();
  27.  
  28. }
  29.  
  30. @Override
  31. public void onClick(View view) {
  32. drawImage();
  33. }
  34.  
  35. private void drawPaths() {
  36. AffineTransform mat1;
  37.  
  38. // The path.
  39. com.mapdigit.drawing.geometry.Path path;
  40.  
  41. // Colors
  42. Color redColor = new Color(0x96ff0000, true);
  43. Color greenColor = new Color(0xff00ff00);
  44. Color blueColor = new Color(0x750000ff, true);
  45.  
  46. String pathdata
  47. = "M 60 20 Q -40 70 60 120 Q 160 70 60 20 z";
  48. mat1 = new AffineTransform();
  49. mat1.translate(30, 40);
  50. mat1.rotate(-30 * Math.PI / 180.0);
  51. path = com.mapdigit.drawing.geometry.Path.fromString(pathdata);
  52. // Clear the canvas with white color.
  53. graphics2D.clear(Color.WHITE);
  54.  
  55. graphics2D.setAffineTransform(new AffineTransform());
  56. SolidBrush brush = new SolidBrush(greenColor);
  57. graphics2D.fill(brush, path);
  58. graphics2D.setAffineTransform(mat1);
  59.  
  60. brush = new SolidBrush(blueColor);
  61. com.mapdigit.drawing.Pen pen
  62. = new com.mapdigit.drawing.Pen(redColor, 5);
  63. graphics2D.setPenAndBrush(pen, brush);
  64. graphics2D.draw(null, path);
  65. graphics2D.fill(null, path);
  66.  
  67. }
  68.  
  69. private void drawPolys() {
  70. AffineTransform mat1;
  71.  
  72. // Colors
  73. Color redColor = new Color(0x96ff0000, true);
  74. Color greenColor = new Color(0xff00ff00);
  75. Color blueColor = new Color(0x750000ff, true);
  76.  
  77. Polyline polyline;
  78. Polygon polygon;
  79. Polygon polygon1;
  80.  
  81. String pointsdata1
  82. = "59,45,95,63,108,105,82,139,39,140,11,107,19,65";
  83. mat1 = new AffineTransform();
  84. mat1.translate(30, 40);
  85. mat1.rotate(-30 * Math.PI / 180.0);
  86. polyline = new Polyline();
  87. polygon = new Polygon();
  88. polygon1 = new Polygon();
  89. Point[] points = Point.fromString(pointsdata1);
  90. for (int i = 0; i < points.length; i++) {
  91. polyline.addPoint(points[i].x, points[i].y);
  92. polygon.addPoint(points[i].x, points[i].y);
  93. polygon1.addPoint(points[i].x, points[i].y);
  94. }
  95. // Clear the canvas with white color.
  96. graphics2D.clear(Color.WHITE);
  97.  
  98. graphics2D.setAffineTransform(new AffineTransform());
  99. SolidBrush brush = new SolidBrush(greenColor);
  100. graphics2D.fillPolygon(brush, polygon);
  101. graphics2D.setAffineTransform(mat1);
  102.  
  103. brush = new SolidBrush(blueColor);
  104. com.mapdigit.drawing.Pen pen
  105. = new com.mapdigit.drawing.Pen(redColor, 5);
  106. graphics2D.setPenAndBrush(pen, brush);
  107. graphics2D.fillPolygon(null, polygon1);
  108. graphics2D.drawPolyline(null, polyline);
  109.  
  110. }
  111.  
  112. }