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

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 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记