java - 将 Java 类和方法移植到 Android。 (TextLayout、Font、Graphics2D 等)

标签 java android text porting graphics2d

我一直在玩弄 Android 并尝试移植 Java 应用程序。以下是一些关于我遇到的问题的问题,并希望得到一些指导。

这是一个相当大的问题(而是多个问题)。但是,我并没有盲目地问他们,因为我已经研究了我可以对他们做些什么,并试图将我的理解付诸实践。我已经花时间提出问题,希望他们对我想要实现的目标有一半的了解。

我将提供一半的代表作为赏金,因为我希望得到彻底的答案和帮助,希望这足以吸引一些人提供帮助。

在此先感谢您的时间和帮助! (期待阅读回复)。

TextLayout && 字体 && Graphics2D

有问题的是以下类和方法:

  • TextLayout
  • TextLayout.getAdvance()
  • TextLayout.getAscent()
  • TextLayout.draw()
  • Graphics2D.getFontRenderContext()

  • 我不太确定 TextLayout 的等价物是什么在安卓中。我读到有些人制作了TextView并使用它,但我不确定这是否会

    为以下工作。我会提供一些我想做的事情的来源,也许有人可以帮助我。

    Java 源代码:
    private Font myStringFont = new Font("Helvetica", Font.BOLD, 12);
    private String myString = "My Test String";
    private int midX = getWidth() / 2;
    private int midY = getHeight() / 2;
    Graphics2D g2 = new Graphics2d();
    
    TextLayout layout = new TextLayout(myString, font, g2.getFontRenderContext());
    g2.drawString(myString, midX - ((int)layout.getAdvance() /2), midY);
    

    Android复制尝试:
    Canvas canvas;
    Paint paint;
    private String myString = "My Test String";
    private float midX = getWidth() / 2;
    private float midY = getHeight() / 2;
    //Unsure what to do about TextLayout <- this is where I need an alternative
    canvas.drawText(myString, midX - /* whatever my alternative to layout.getAdvance() is */ /2), midY);
    

    我一直在确定如何创建 TextLayout 以及为方法 getAdvance() 做什么.我注意到在 Paint.FontMetrics()

    一些可能的替代方案,但我不知道是否有任何比较。

    我也不确定如何处理以下 Java 代码:
    Graphics2D g2 = new Graphics2d();
    private int midX = getWidth() / 2;
    private int midY = getHeight() / 2;
    
    TextLayout layout = new TextLayout(myString, g2.getFont(), g2.getFontRenderContext());
    layout.draw(g2, midX, MidY);
    

    以上问题的回顾/总结:
  • TextLayout 的 Android 替代品是什么? ?
  • 相当于TextLayout.getAdvance() ? (我可以使用fontMetrics 来实现它吗?)
  • 是否有与 Graphics2D.getFontRenderContext() 相同的 Android 版本? ?
  • 你能提供Android的示例源吗?

  • 这是目前我将 Java 移植到 Android 时遇到的最大问题之一。如果有任何帮助、建议、示例等,我将不胜感激。

    字体

    以下是我想要复制的处理 font 的方法, textlayout , 和 graphics2d .第一个来源是 Java 方法和

    下面是我复制它的尝试。

    有问题的是以下类和方法:
  • Font.deriveFont(float size)通过复制当前字体对象并为其应用新样式来创建新字体对象
  • TextLayout.getAdvance()前进是从原点到行方向最右边(最底部)字符前进的距离
  • Graphics2D.setRenderingHint(RenderingHints, RenderingHints)
  • Graphics2D.getFontRenderContext()封装应用程序提示,例如抗锯齿和分数指标

  • Java 源代码:
    private String myString = "Print this test statement";
    private int myStringFontSize = 15;
    private Color myStringFontColor = Color.red;
    private Font myStringFont = new Font("Helvetica", Font.BOLD, myStringFontSize);
    private int midX = getWidth() / 2;
    private int midY = getHeight() / 2;
    
    public drawString(Graphics2D g2) {
        g2.setFont(myStringFont.deriveFont(determineFontSize(g2, myString)));
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALISING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        TextLayout layout = new TextLayout(myString, g2.getFont(), g2.getFontRenderContext());
    
        g2.setPaint(myStringFontColor);
        g2.drawString(myString, midX - ((int) layout.getAdvance() / 2), midY);
    }
    
    protected float determinFontSize(Graphics2D g2, String myString) {
        int space = getWidth();
        float fontSize = 1.0f;
        float finalFontSize = fontSize;
    
        while(fontSize < 25) {
            Font font myString.deriveFont(fontSize);
            Textlayout layout = new TextLayout(waitingMessage, font, g2.getFontRenderContext());
    
            if(layout.getAdvance() > space) {
                finalFontSize = fontSize - 2;
                break;
            }
            fontSize++;
        }
        finalFontSize = fontSize - 4;
        return finalFontSize;
    }
    

    安卓尝试:
    private String myString = "Print this test statement";
    private int myStringFontSize = 15;
    private int myStringFontColor = Color.RED;  //Android uses int rather than Color
    Typeface tf = new Typeface();               //Android uses Typeface rather than Font  
    private float midX = getWidth() / 2;        //Changed to float because drawText requires float
    private float midY = getHeight() / 2;       //changed to float because drawText requires float
    
    
    public drawString(Canvas canvas, Paint paint) {
        tf.create("Helvetica", BOLD);
        paint.setTypeface(tf);
        paint.setTextSize((float) myStringFontSize);
    
        paint.setTextSize(determineFontSize(canvas, myString, paint);
        paint.setAntiAlias(true);
        //NOT SURE WHAT TO DO WITH TextLayout YET
    
        paint.setColor(myStringFontColor);
        canvas.drawText(myString, midX - ((int)layout.getAdvance() / 2), midY, paint);  //Not sure how to deal with layout.getAdvance() just yet    
    
    }
    
    protected float determineFontSize(Canvas canvas, String myString, Paint paint) {
        float fontSize = 1.0f;
        float finalFontSize = fontSize;
        int space = getWidth();
    
        while(fontSize < 25) {
            paint.setTextSize(fontSize);
            //NOT SURE WHAT TO DO ABOUT TextLayout.getAdvance() YET or g2.getFontRenderContext()
    
            if(layout.getAdvance() > space) {
                finalFontSize = fontSize - 2;
                break;
            }
            fontSize++;
        }
        finalFontSize = fontSize - 4;
        return finalFontSize;            
    }
    

    关于上述方法的最终问题:
  • TextLayout.getAdvance() 我有什么选择? ? (是否因TextLayout的问题已回答,请忽略)
  • Graphics2D.getFontRenderContext() 我有什么选择? ?
  • 我的 Android 源代码是否复制 Java 源代码?如果不是,需要改变什么?
  • 有没有更好的方法来做到这一点?如果是这样,怎么做?

  • Elipse2D.Double(双 x, 双 y, 双 w, 双 h)

    有没有办法创建一个椭圆的子类来创建等同于 Java Ellipse2D.Double 的东西?如果是这样,一个人会怎么做?

    组件适配器 && 组件事件

    我在 java 中有这些,因为我的组件可以调整大小,在 Android 中这些 View 的等价物是什么? (如有)

    最佳答案

    TextLayout , FontGraphics2D问题可以简单地在 Android 中通过使用 TextView 来解决。 ,布局 xml 文件中的一些布局属性,并可能用一些代码对其进行扩充。举个例子,TextView可以在布局xml中声明如下:

    <TextView android:id="@+id/logo"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:paddingTop="5dip"
        android:text="Fancy Logo"
        android:textSize="24sp"
        android:layout_weight="0.8"
        android:textStyle="bold"
        android:textColor="@color/black" />
    

    大多数属性是不言自明的,但 layout_width尚未设置,因为我们将增加 TextView使用会影响其占用宽度的字体。
    AssetManager assetManager = getContext().getAssets();       
    
    Typeface tf = Typeface.createFromAsset(assetManager,"GILB.TTF");                
    
    TextView logo = (TextView)findViewById(R.id.logo);
    logo.setTypeface(tf);
    
    setTypeface()方法重载了一个额外的样式参数,该参数也可以提供粗体和/或斜体效果。

    此文本在屏幕上绘制的具体位置将取决于您选择的布局或布局组合,例如RelativeLayout , AbsoluteLayout等 - 有很多资源可以教你如何使用这些资源以达到良好的效果。

    如果这太有限,那么您可以直接在 Canvas 上绘制。在这里,您可以指定一个 Paint 或 TextPaint 对象,您可以在其中设置抗锯齿和其他几种绘画效果。

    代替Ellipse2D.Double , 你可以使用 Canvas.drawOval(RectF oval, Paint paint) RectF object 指定椭圆的边界框。

    要使 View (组件)能够自动调整大小,您应该尽可能使用灵活的布局属性,例如 wrap_content , match_parentfill_parent而不是特定的“倾角”尺寸。图形应转换为 9-patch 格式,以便它们可以拉伸(stretch)以适应尺寸变化。

    如果确实需要计算文本的长度,或者指定文本大小以适应特定的物理空间,那么可以引用this回答SO。

    关于java - 将 Java 类和方法移植到 Android。 (TextLayout、Font、Graphics2D 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6822316/

    相关文章:

    java - 如何将Timer的秒数转换为hh :mm:ss?

    java - Apache Camel 创建消费者组件

    android - 如何在android studio中创建一个子包

    android - 打开浏览器 Activity ,但阻止它出现在 Activity 历史记录中

    java - 如何在动态创建的 ListView 中更改文本颜色、大小和字体

    java - 在方法中使用对象

    java - 我如何限制 Jtextfield 中我想要的输入的长度?

    android - AlertDialog.Builder 不在 Fragment 中显示来自 setUserVisibleHint(boolean) 的按钮

    javascript - 如何使用 JavaScript 在多个 HTML 页面中重复使用格式化文本?

    text - 准确的文本生成