`
一口三个汉堡
  • 浏览: 115315 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

实例5--自动换行(修订版)

阅读更多

  这个实例主要是运用字体的只是,但是android自带就几种,虽然android有提供可以自己加载字体的功能,但我试了下,没发现成功的,所以我代码里面就没有弄了,就弄了自带的。明天再试试效果,发现书本的代码不怎么适合android,当字体变大时,会出现按两次才能换行的bug。已经修改了.

下面是效果图:



 mainView的代码:

package com.wjh.demon_5;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

public class MainView extends SurfaceView implements Callback,Runnable{
	Thread gameThread = null;
	boolean isGame = true;
	SurfaceHolder holder = null;
	Paint forePaint = null;
	Paint backPaint = null;
	
	int keyCode = -1;
	boolean isKeyDown = false;
	
	public int	m_nWidth = 50;					//显示宽度
	public Typeface m_nTypeFace = null;						//存储字体
	public MainView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		setFocusable(true);
		getHolder().addCallback(this);
		holder = this.getHolder();
		backPaint = new Paint();
		backPaint.setColor(Color.BLACK);
		
		forePaint = new Paint();
		forePaint.setTypeface(Typeface.DEFAULT_BOLD);
		forePaint.setTextSize(20);
		forePaint.setColor(Color.RED);
		
		
	
		
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(isGame)
		{
			input();
			logic();
			doDraw();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}		
		}
		
	}
	//开始游戏主线程
	public void start()
	{
		if(gameThread == null)
		{
		gameThread = new Thread(this);
		gameThread.start();
		}
	}
	//停止游戏主线程
	public void stop()
	{
		isGame = false;
		if(gameThread != null)
		{
			try {
				gameThread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	//输入判断
	public void input()
	{
		if( keyCode == KeyEvent.KEYCODE_DPAD_UP && isKeyDown)
		{
			m_nWidth = m_nWidth +(int)forePaint.getTextSize(); 
			isKeyDown = false;
		}
		//如果按下方向键的下键,则调整当前行的位置
		else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN && isKeyDown)
		{
			m_nWidth = m_nWidth - (int)forePaint.getTextSize();
			isKeyDown = false;
		}
		
	}
	//逻辑判断
	public void logic()
	{
		
	}
	public void doDraw()
	{
		Canvas c = null;
		try
		{
		c = holder.lockCanvas();
		synchronized (holder) {
			paint(c);
		}
		}finally{
			if(c != null)
			{
			holder.unlockCanvasAndPost(c);
			}
		}
	}
	//画图
	public void paint(Canvas canvas)
	{
		//清贫
		canvas.drawRect(0, 0, getWidth(), getHeight(),backPaint);
		
		TextAjust.AjustDrawString(canvas,forePaint,
				"我要自动换行我要自动换行我要自动换行我要自动换行",
				m_nWidth, 50, 50, 30 );
		
		
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		start();
		
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		stop();
		
	}
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		//如果按下方向键的上键,则调整当前行的位置
		this.keyCode = keyCode;
		isKeyDown = true;

		return true;
	}
	
}
 

 书上提供的换行功能源码,我把画图的改成android的,其他的没改,但代码效果不好

下面给出代码

TextAjust.java

 

package com.wjh.demon_5;

import android.graphics.Canvas;
import android.graphics.Paint;


public class TextAjust {
	static public int ChangLine(String str, Paint paint, int linewd )
	{ 
		int wd = 0;
		char ch;
		for (int i = 0; i < str.length(); i++) 
		{ 
			ch = str.charAt(i);
			if (ch == '\n')
				return i + 1;
			 
			wd += paint.getTextSize();
			if (wd > linewd)
				return i;
		}
		return 0;
	}

	static public void AjustDrawString(Canvas canvas,Paint paint, String strText, 
			int linewd, int x, int y, int yDis )
	{
		String subStr;
		int nPos; //需要换行的位置
		while (true)
		{
			//获得句子的断点位置
			nPos = ChangLine(strText, paint, linewd );
			if (nPos == 0)
			{
				//如果nPos为0,代表输入的字符串为空
				canvas.drawText( strText, x, y,paint);
				break;
			}
			else
			{
				//判断是否最后一句
				if (strText.charAt(nPos - 1) == '\n' )
					subStr = strText.substring(0, nPos - 1);
				else
					subStr = strText.substring(0, nPos);
				canvas.drawText( subStr, x, y, paint);
				//截断句子,继续进行处理
				strText = strText.substring(nPos, strText.length());
				y = y + yDis;
			}
		}
	}
}

 apk文件(将后缀改为apk):Demon_5.zip

源代码文件:Demon_5.rar

  • 大小: 2.1 KB
  • 大小: 2.1 KB
0
0
分享到:
评论
4 楼 dengminghua1016 2011-08-04  
jkjkkjjkljk


hjjhjkkljklj
3 楼 dengminghua1016 2011-08-04  
    


2 楼 dengminghua1016 2011-08-04  
不错,真的不错!!!




不错,真的不错!!!





不错,真的不错!!!
1 楼 dengminghua1016 2011-08-04  
不错,真的不错!!!
不错,真的不错!!!
不错,真的不错!!!
不错,真的不错!!!
不错,真的不错!!!
不错,真的不错!!!
不错,真的不错!!!
不错,真的不错!!!


不错,真的不错!!!


不错,真的不错!!!

相关推荐

    button自适应高度和自动换行

    "button自适应高度和自动换行"这个主题主要关注如何让按钮在不同屏幕尺寸和内容长度下保持良好的视觉效果。以下是对这个主题的详细解释: 一、自适应高度 1. CSS Flexbox:使用Flexbox布局模型可以轻松实现按钮的...

    Android 自动翻页-文字自动换行的例子.rar

    Android 自动翻页-文字自动换行的例子,测试自动换行,设置文字自动换行,得到字符串的信息,通过绘制TextUtil:实现自动换行,包括:行数、页数等信息,内部调用,本源码演示了文字自动换行的同时,还告诉初学者,...

    51单片机Proteus仿真实例 K1-K4-分组控制LED

    51单片机Proteus仿真实例 K1-K4-分组控制LED51单片机Proteus仿真实例 K1-K4-分组控制LED51单片机Proteus仿真实例 K1-K4-分组控制LED51单片机Proteus仿真实例 K1-K4-分组控制LED51单片机Proteus仿真实例 K1-K4-分组...

    多个view自动换行

    在Android开发中,"多个view自动换行"通常是指在一个布局容器中,当视图(View)数量过多,无法在一行内显示时,系统能够自动将它们换行展示,以适应不同的屏幕尺寸和布局需求。这涉及到对ViewGroup的管理和布局管理...

    JTable自动换行

    在这个类中,我们创建了一个`JTextArea`实例,并设置了其自动换行和根据单词边界换行的属性。然后,在`getTableCellRendererComponent`方法中,我们根据单元格的状态(是否被选中、是否有焦点)设置背景色和前景色,...

    Android自动换行标签控件(二)

    在这个场景中,我们关注的是一个名为"Android自动换行标签控件(二)"的主题,它涉及到如何利用`ViewGroup`来实现一个可以自动换行的标签控件。这样的控件通常用于展示多条分类标签,例如新闻类别或者产品属性,当...

    Android自动换行标签控件LineBreakLayout

    5. **实例应用** - 应用商店的分类标签栏 - 新闻应用的标签导航 - 用户设置界面的切换选项 6. **注意事项** - 确保所有子视图的宽度都是wrap_content,以便`LineBreakLayout`能够正确计算换行。 - 如果标签...

    Android 自定义自动换行布局控件

    本文将详细讲解如何创建一个名为`LinearLayoutAutoSwapRow`的自定义布局控件,它具备自动换行的功能,适用于展示一系列小图标或者文字,如应用列表、商品展示等场景。 首先,我们要明白`LinearLayout`是Android中的...

    表格自动换行主义CSS属性

    通过以上对CSS属性的详细解析及应用实例的介绍,我们可以看出,合理利用`table-layout`、`word-break`和`word-wrap`等CSS属性,能够有效改善表格内文本的显示效果,尤其是在需要处理大量文本数据的情况下,自动换行...

    自动换行LayoutManager

    当我们需要在有限的屏幕空间内展示多行多列的数据,并且希望在内容增多时自动换行,这时就需要自定义一个LayoutManager来实现这一功能。本话题将详细介绍如何通过自定义RecyclerView的LayoutManager来实现自动换行的...

    51单片机Proteus仿真实例 K1-K4 键状态显示

    51单片机Proteus仿真实例 K1-K4 键状态显示51单片机Proteus仿真实例 K1-K4 键状态显示51单片机Proteus仿真实例 K1-K4 键状态显示51单片机Proteus仿真实例 K1-K4 键状态显示51单片机Proteus仿真实例 K1-K4 键状态显示...

    51单片机Proteus仿真实例 K1-K4 控制LED移位

    51单片机Proteus仿真实例 K1-K4 控制LED移位51单片机Proteus仿真实例 K1-K4 控制LED移位51单片机Proteus仿真实例 K1-K4 控制LED移位51单片机Proteus仿真实例 K1-K4 控制LED移位51单片机Proteus仿真实例 K1-K4 控制...

    Flex中TabBar自动换行的实现

    然而,默认情况下,Flex的TabBar组件不会自动换行,而是将所有选项卡排列在同一行,如果选项卡数量过多,超出容器宽度,部分选项卡就会被裁剪,用户体验可能会受到影响。本篇文章将详细介绍如何在Flex中实现TabBar...

    RichEdit 自动换行关键字高亮

    本文将深入探讨如何在`RichEdit`控件中实现自动换行以及关键字的高亮显示。 首先,我们要理解自动换行的概念。自动换行是指当用户在编辑框中输入文字时,如果一行已满,程序会自动将剩余的文字移到下一行。在`Rich...

    listView实现文字编辑的自动换行

    要实现ListView中的文字编辑自动换行,我们需要结合EditText控件和自定义Adapter来完成这一功能。以下将详细阐述如何实现这一需求。 首先,我们创建一个布局文件,用于定义ListView中每一项的视图。在这个布局中,...

    UILabel自动换行

    在某些场景下,我们希望文本能根据其内容自动换行,以适应不同的屏幕尺寸和布局需求。`UILabel` 的自动换行功能正是解决这一问题的关键。本教程将详细介绍如何实现 `UILabel` 的自动换行,并通过示例代码来展示具体...

    全套消防验收资料实例填写-a火灾自动报警...doc

    全套消防验收资料实例填写-a火灾自动报警...doc

    axure-常用图标-实例

    axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 axure-常用图标-实例 ...

    VC Listbox自绘,实现不同高度以及自动换行

    在你的listviewtest项目中,你可以创建一个CMyListBox类的实例,然后按照上述方法进行自绘操作,这样你的Listbox就能显示不同高度的行并自动换行了。这个技术对于创建更灵活、更适应复杂数据的用户界面非常有用。

    ios-动态创建多个标签,自动换行.zip

    在iOS开发中,动态创建多个标签并实现自动换行是一项常见的需求,特别是在界面设计中需要展示多行可滚动的文字内容时。本Demo“ios-动态创建多个标签,自动换行”提供了一个很好的解决方案,让我们深入探讨一下这个...

Global site tag (gtag.js) - Google Analytics