(Android) 将资源保存在静态最终常量中是否安全? (现在资源不是静态最终的)

(Android) Is safe to save resource in static final constant? (Now resource is not static final)

在 ADT 14 之后,R class 值不再是“static final int”,它只是“static int”。 我想使用常量作为“静态最终”。如下图

public static final int exampleNameId = R.string.exampleName;

申请运行后,如果android系统要更改R.string.exampleName会出问题。因为 exampleNameId 是最终的所以系统无法更改值。

我该如何解决这个问题?

如果您有实现 Shape 接口的任何东西(例如 Polygon)。您可以获得该形状的 PathIterator,它为 outline 提供了可配置的粒度。

以下示例获取 flattened PathIterator 以避免必须处理 Bezier curves 并仅使用 drawLine 来重现轮廓。由于绘图中没有间隙,我不必担心使用实际的迭代器命令来重新定位开始和停止绘图位置(即笔向上和向下笔等)。

要完全理解这一点,您需要阅读 Java API 文档中的一些方法。


    import java.awt.BasicStroke;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.PathIterator;

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;

    public class Outline extends JPanel {

       JFrame       frame = new JFrame();
       PathIterator iter;

       public static void main(String[] args) {
          SwingUtilities.invokeLater(() -> new Outline().start());
       }

       public void start() {
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.add(this);
          setPreferredSize(new Dimension(500, 500));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
          demo();
       }

       public void demo() {
          double smajAxis = 200;
          double sminAxis = 100;
          Ellipse2D.Double oval = new Ellipse2D.Double(250 - smajAxis / 2,
                            250 - sminAxis / 2, smajAxis, sminAxis);
          iter = oval.getPathIterator(null, .02);
          repaint();

       }
       public void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2d = (Graphics2D) g;
          g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
          g2d.setStroke(new BasicStroke(2));
          double[] start = new double[2];
          double[] end = new double[2];
          iter.currentSegment(start);
          int x1 = (int) start[0];
          int y1 = (int) start[1];
          int savex1 = x1;
          int savey1 = y1;
          iter.next();
          while (!iter.isDone()) {
             iter.currentSegment(end);
             int x2 = (int) end[0];
             int y2 = (int) end[1];
             g2d.drawLine(x1, y1, x2, y2);
             x1 = x2;
             y1 = y2;
             iter.next();
          }
          g2d.drawLine(x1, y1, savex1, savey1);

       }
    }