YAOWENXIAO 2015-02-02 09:17 采纳率: 100%
浏览 6216
已采纳

Android阅读器如何实现文字两端对齐

Android阅读器如何实现文字两端对齐,达到类似ireader一样的效果图片说明

  • 写回答

2条回答 默认 最新

  • huge_tang 2015-02-04 07:52
    关注

    在android中的webview中,可以对文本内容进行对齐,具体方法如下:
    public class MainActivity extends Activity {

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
    
        String htmlText = " %s ";  
        String myData = "Hello World! This tutorial is to show demo of displaying text with justify alignment in WebView.";  
    
        WebView webView = (WebView) findViewById(R.id.webView1);  
        webView.loadData(String.format(htmlText, myData), "text/html", "utf-8");  
    }  
    

    }

    方案二:使用textView改造:
    MainActivity中:

    Display display = getWindowManager().getDefaultDisplay();

    DisplayMetrics dm = new DisplayMetrics();

    display.getMetrics(dm);

    width = dm.widthPixels;

    //根据屏幕调整文字大小
    mArticleTextView.setLineSpacing(0f, 1.5f);
    mArticleTextView.setTextSize(8*(float)width/320f);

    //设置TextView
    mArticleTextView.setText("TextView需要显示的文本内容");

    TextJustification.justify(mArticleTextView,mArticleTextView.getWidth());首先设置TextView的显示字体大小和文本内容,这里设置字体大小根据屏幕尺寸调整。然后调用自定义的类Textustification中的justify方法来实现TextView的分散对齐,两个参数分别是TextView控件以及控件的宽度。

    自定义的类TextJustification内容如下:

    import java.util.ArrayList;

    import android.graphics.Paint;
    import android.text.TextUtils;
    import android.widget.TextView;
    import android.widget.TextView.BufferType;

    public class TextJustification {

    public static void justify(TextView textView, float contentWidth) {
        String text=textView.getText().toString();
        String tempText;
        String resultText = "";
        Paint paint=textView.getPaint();
    
        ArrayList<String> paraList = new ArrayList<String>();       
        paraList = paraBreak(text);       
        for(int i = 0; i<paraList.size(); i++) {           
            ArrayList<String> lineList=lineBreak(paraList.get(i).trim(),paint,contentWidth);           
            tempText = TextUtils.join(" ", lineList).replaceFirst("\\s*", "");           
            resultText += tempText.replaceFirst("\\s*", "") + "\n";       
        }               
    
        textView.setText(resultText);
    }
    //分开每个段落
    public static ArrayList<String> paraBreak(String text, TextView textview) {
        ArrayList<String> paraList = new ArrayList<String>();
        String[] paraArray = text.split("\\n+");
           for(String para:paraArray) {
               paraList.add(para);
        }
        return paraList;
    }
    
    //分开每一行,使每一行填入最多的单词数
    private static ArrayList<String> lineBreak(String text, Paint paint, float contentWidth){
        String [] wordArray=text.split("\\s");
        ArrayList<String> lineList = new ArrayList<String>();
        String myText="";
    
        for(String word:wordArray){
            if(paint.measureText(myText+" "+word)<=contentWidth)
                myText=myText+" "+word;
            else{
                int totalSpacesToInsert=(int)((contentWidth-paint.measureText(myText))/paint.measureText(" "));
                lineList.add(justifyLine(myText,totalSpacesToInsert));
                myText=word;
            }
        }
        lineList.add(myText);
        return lineList;
    }
    //已填入最多单词数的一行,插入对应的空格数直到该行满
    private static String justifyLine(String text,int totalSpacesToInsert){
        String[] wordArray=text.split("\\s");
        String toAppend=" ";
    
        while((totalSpacesToInsert)>=(wordArray.length-1)){
            toAppend=toAppend+" ";
            totalSpacesToInsert=totalSpacesToInsert-(wordArray.length-1);
        }
        int i=0;
        String justifiedText="";
        for(String word:wordArray){
            if(i<totalSpacesToInsert)
                justifiedText=justifiedText+word+" "+toAppend;
    
            else               
                justifiedText=justifiedText+word+toAppend;
    
            i++;
        }
    
        return justifiedText;
    }
    

    }这个类完成了TextView内部文字的排版工作,主要分3个步骤:
    1、将一篇文章按段落分成若干段(如果只有一段可以略去该步骤);

    2、将每一段的文字拆分成各个单词,然后根据控件长度确定每一行最多可以填入的单词数,并且算出排满该行还需要填入几个空格。

    3、填入空格。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题