这阵子忙项目,写了个控件,有点像文本域,显示文章用的,带滚动条,有拖拽事件,不过还是有个小问题不咋完美。
我承认我的代码不适合阅读,因为注释比较少,并且这个控件的开发难度有点大,主要是拖拽的地方有点复杂,最重要的是,代码还经过一定的优化,合并了许多变量,不过有兴趣的人也可以挑战一下~
设计思路很简单,滚动条的走动依附文本的走动,根据倍数算出各个变量。
具体的实现我自己都不愿意回忆了。
该代码发布之意在于供人使用,不侧重于供人学习阅读。
package com.ctai.items.textarea;
import java.util.Vector;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import com.ctai.utils.ColorSet;
import com.ctai.utils.DefaultProperties;
public class Textarea
{
/** 文字颜色 */
private int i_c_strColor;
/** x, y, 宽, 高*/
public int x, y, width, hight;
/** 文字整体高度 */
private int i_allStrHight;
/** 整体高度 */
private int i_strHight;
private Vector v;
/** 倍数 */
private int Multiple;
/** 滚动条高度 */
private int scrollHight;
/** 滚动条的X和Y坐标 */
private int scrollX, scrollY;
/** ↑↓按钮方块固定Y */
private int boxY;
/** ↑↓按钮方块的宽高 */
private int boxWH = 16;
/** 方向键滚屏像素值 */
private int rollValue;
/** 方向键滚屏侧滑块移动的偏差像素值 */
private int rollMoveScrollValue;
/** 临时变量 */
private int temp, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
/** 文字是否超过一篇 */
private boolean b_isHaveMore = true;
private int i_dragged[] = new int[2];
/**
* 文本域
* @param st_strOut 文本域内文字
* @param font 当前g的字体
* @param i_c_strColor 文字颜色
* @param x
* @param y
* @param width 宽
* @param hight 高
* @param rollValue 方向键滚屏像素值
* */
public Textarea(String st_strOut, Font font, int i_c_strColor, int x, int y, int width, int hight, int rollValue)
{
this.i_c_strColor = i_c_strColor;
this.x = x;
this.scrollX = x + width; // 滑块X的坐标初始化
this.y = y;
this.temp7 = y;
this.boxY = y;
this.scrollY = y + boxWH; // 滑块Y的坐标初始化
this.width = width;
this.hight = hight;
this.rollValue = rollValue;
v = getSubsection(st_strOut, font, width, "\r\n"); // 赋值vector
init();
temp8 = 320 - (boxY + boxWH * 2 + scrollHight + 30);
}
public void init()
{
Multiple = (temp6 + ((260 / i_strHight) - 1)) / (260 / i_strHight); //倍数
if (Multiple == 1)
{
b_isHaveMore = false;
}
else
{
scrollHight = (hight - boxWH * 2) * 260 / (temp6 * i_strHight);
}
temp = hight - boxWH;
temp2 = (boxWH >> 2);
temp3 = scrollX + (boxWH >> 1);
temp4 = temp2 * 3;
temp5 = boxWH * 2;
}
public void paint(Graphics g)
{
g.setColor(i_c_strColor);
if (v != null && v.size() > 0)
{
for (int i = 0; i < v.size(); i++)
{
g.drawString(v.elementAt(i).toString(), x, i * i_strHight + y, 0);
}
}
// 画整个滚动条
g.setColor(ColorSet.scrollBackColor);
g.fillRect(scrollX - 1, boxY - 1, boxWH + 2, hight + 2);
// 画上、下小箭头块边框
g.setColor(ColorSet.scrollBorderColor);
g.fillRect(scrollX - 1, boxY - 1, boxWH + 2, boxWH + 2);
g.fillRect(scrollX - 1, boxY + temp - 1, boxWH + 2, boxWH + 2);
// 画上、下箭头小块
g.setColor(ColorSet.scrollFontColor);
g.fillRect(scrollX, boxY, boxWH, boxWH);
g.fillRect(scrollX, boxY + temp, boxWH, boxWH);
// 画箭头
g.setColor(ColorSet.scrollIcoColor);
// 画∧
// 画/
g.drawLine(temp3, boxY + temp2, scrollX + temp2, boxY + temp4);
// 画\
g.drawLine(temp3, boxY + temp2, scrollX + temp4, boxY + temp4);
// 画∨
// 画\
g.drawLine(temp3, boxY + temp + temp4, scrollX + temp2, boxY + temp + temp2);
// 画/
g.drawLine(temp3, boxY + temp + temp4, scrollX + temp4, boxY + temp + temp2);
g.setColor(ColorSet.scrollBorderColor);
g.fillRect(scrollX, scrollY + rollMoveScrollValue, boxWH, scrollHight);
g.setColor(ColorSet.scrollFontColor);
g.fillRect(scrollX + 1, scrollY + rollMoveScrollValue + 1, boxWH - 2, scrollHight - 2);
}
public void pointerDragged(int x, int y)
{
if(b_isHaveMore)
{
i_dragged[1] = i_dragged[0];
i_dragged[0] = y;
if(x < scrollX && y > boxY && y < 290)
{
this.y -= i_dragged[0] - i_dragged[1];
if (this.y - this.temp7 <= i_allStrHight)
{
this.y = i_allStrHight + this.temp7;
}
else if (this.y >= boxY)
{
this.y = boxY;
}
rollMoveScrollValue = getXY(temp8, this.y - this.temp7, i_allStrHight);
if (rollMoveScrollValue < 0)
{
rollMoveScrollValue = 0;
}
}
if(x > scrollX && x < 239 && y > scrollY + rollMoveScrollValue && y < scrollY + rollMoveScrollValue + scrollHight)
{
this.y += (i_dragged[0] - i_dragged[1]) * (i_allStrHight / (hight - (boxWH * 2) - scrollHight));
if (this.y - this.temp7 <= i_allStrHight)
{
this.y = i_allStrHight + this.temp7;
}
else if (this.y >= boxY)
{
this.y = boxY;
}
rollMoveScrollValue = getXY(temp8, this.y - this.temp7, i_allStrHight);
if (rollMoveScrollValue < 0)
{
rollMoveScrollValue = 0;
}
}
}
}
public void keyPressed(int keyCode)
{
if (b_isHaveMore)
{
if (keyCode == DefaultProperties.KEY_DOWN)
{
this.y -= rollValue;
if (this.y - this.temp7 <= i_allStrHight)
{
this.y = i_allStrHight + this.temp7 + 2;
}
}
if (keyCode == DefaultProperties.KEY_UP)
{
this.y += rollValue;
if (this.y >= boxY)
{
this.y = boxY;
}
}
rollMoveScrollValue = getXY(temp8, this.y - this.temp7, i_allStrHight);
if (rollMoveScrollValue < 0)
{
rollMoveScrollValue = 0;
}
}
}
public void pointerPressed(int x, int y)
{
if (b_isHaveMore)
{
i_dragged[1] = y;
i_dragged[0] = y;
if (x > scrollX && x < scrollX + boxWH && y > scrollY && y < scrollY + hight - temp5) // 在滑块内点击时间的捕捉
{
if (y < scrollY + rollMoveScrollValue)
{
this.y += hight;
if (this.y >= boxY)
{
this.y = boxY;
}
}
else if (y > scrollY + rollMoveScrollValue + scrollHight)
{
this.y -= hight;
if (this.y - this.temp7 <= i_allStrHight)
{
this.y = i_allStrHight + this.temp7 + 2;
}
}
rollMoveScrollValue = getXY(temp8, this.y - this.temp7, i_allStrHight);
if (rollMoveScrollValue < 0)
{
rollMoveScrollValue = 0;
}
}
else if (x > scrollX && x < scrollX + boxWH && y > boxY && y < boxY + boxWH)
{
this.y += rollValue;
if (this.y >= boxY)
{
this.y = boxY;
}
rollMoveScrollValue = getXY(temp8, this.y - this.temp7, i_allStrHight);
if (rollMoveScrollValue < 0)
{
rollMoveScrollValue = 0;
}
}
else if (x > scrollX && x < scrollX + boxWH && y > boxY + temp && y < boxY + hight)
{
this.y -= rollValue;
if (this.y - this.temp7 <= i_allStrHight)
{
this.y = i_allStrHight + this.temp7 + 2;
}
rollMoveScrollValue = getXY(temp8, this.y - this.temp7, i_allStrHight);
}
}
}
private final int getXY(int w, int x, int Exp)
{
return (int) (((long) (x * w) * 1000000) / ((long) Exp * 1000000));
}
/** 此方法会根据文字内容自动返回长度适应给定width的vector */
public Vector getSubsection(String strSource, Font font, int width, String strSplit)
{
Vector vector = new Vector();
String temp = strSource;
int i, j;
int LastLength = 1;
int step = 0;
try {
while (!temp.equals(""))
{
i = temp.indexOf("\n");
if (i > 0)
{
if (font.stringWidth(temp.substring(0, i - 1)) >= width)
{
i = -1;
}
}
if (i == -1)
{
if (LastLength > temp.length())
{
i = temp.length();
}
else
{
i = LastLength;
step = font.stringWidth(temp.substring(0, i)) > width ? -1 : 1;
if (i < temp.length())
{
while (!(font.stringWidth(temp.substring(0, i)) <= width && font.stringWidth(temp.substring(0, i + 1)) > width))
{
i = i + step;
if (i == temp.length())
{
break;
}
}
}
}
if (!strSplit.equals(""))
{
j = i;
if (i < temp.length())
{
while (strSplit.indexOf(temp.substring(i - 1, i)) == -1)
{
i--;
if (i == 0)
{
i = j;
break;
}
}
}
}
}
LastLength = i;
vector.addElement(temp.substring(0, i));
if (i == temp.length())
{
temp = "";
}
else
{
temp = temp.substring(i);
if (temp.substring(0, 1).equals("\n"))
{
temp = temp.substring(1);
}
}
}
}
catch (Exception e)
{
System.out.println("getSubsection:" + e);
}
temp6 = vector.size();
i_strHight = font.getHeight();
i_allStrHight = 320 - boxY - 30 - vector.size() * i_strHight;
return vector;
}
}
有些颜色的静态变量是另一个颜色管理类的,使用时替换成你想要的颜色即可。
此控件支持的触屏事件:文字域的拖拽,滚动条的拖拽,上下按钮的点击,滚动条底色区域的翻屏事件
此控件支持的按键事件:手机键盘上下按钮文字像素滚动。
附件有这个类的源码。
分享到:
相关推荐
**J2ME UI 控件包详解** 在Java 2 Micro Edition (J2ME)的开发中,用户界面(UI)的设计至关重要,它直接影响到应用程序的用户体验。Mewt 是一个专为J2ME设计的UI控件库,它提供了一系列轻量级、可自定义皮肤的UI...
本文将详细介绍如何在J2ME低级用户界面(UI)中实现文字的分行功能,并提供一个实用的函数示例。 首先,我们要理解的是,文字分行的核心在于找到合适的位置将字符串分割为多个适合指定宽度的子字符串。在给定的代码...
由于资源有限,J2ME提供了两种主要的UI框架:高级UI(MIDP CLDC)和低级UI(通常基于Graphics类)。本教程将深入探讨如何使用低级UI来构建菜单和简单的通讯录应用。 首先,我们要理解低级UI的基本概念。低级UI是...
在J2ME中处理触摸屏事件主要依赖于MIDP(Mobile Information Device Profile)的低级图形API,如`Graphics`类和`Pointer`接口。开发者需要监听`PointerEvent`,通过`PointerEvent.getX()`和`PointerEvent.getY()`...
基于低级界面的j2me UI库类,有demo和源码。高级界面的东西虽然好用但是在不同的手机上面显示得不一样,有的好看有的很丑,但是基于低级界面的就不一样了。在不同手机上显示出来都是一样的,这个UI库类是企业级的。...
**J2ME轻量级UI控件:LWUIT 1.2.1** Java Micro Edition(J2ME)是一种适用于小型设备和嵌入式系统的Java平台,它为开发移动应用提供了基础。在J2ME中,用户界面的构建通常是一项挑战,因为它需要在资源有限的设备...
由于J2ME的资源有限,特别是在早期的移动设备上,它并不像Java SE或Android那样提供完整的UI框架和键盘支持。因此,开发者需要自定义解决方案来实现中文输入。本篇文章将深入探讨如何在J2ME的低级画布(Custom ...
**J2ME高级界面控件在Eclipse中的应用** Java Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机和智能家电。在开发J2ME应用程序时,创建用户友好的界面是至关重要的。Eclipse作为...
深入理解这些示例,开发者可以学习如何利用J2ME低级API处理用户输入事件、响应设备状态改变以及创建自定义的UI元素。例如,通过阅读SizeChangeCanvas.java,我们可以学习如何检测并响应设备屏幕尺寸的变化,这在...
**J2ME低级界面全示例Eclipse** Java Micro Edition (J2ME) 是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如手机、智能手表等。J2ME提供了多种框架来构建应用程序,其中的低级界面(Low-Level User ...
**J2ME高级UI编程源码详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于移动设备、嵌入式系统等资源有限的设备上进行应用程序开发。在J2ME中,创建用户界面(UI)是一项关键任务,它直接影响到...
J2ME平台的UI界面分为两种,一种称为高级UI组件,一种叫做低级UI组件。高级的UI组件使用方便,创建一个窗口只需要把参数传入相应的构造就可以了。但是高级UI组件无法自定义样式,一般都是手机默认的样式。如果想界面...
这是我业余时间写的一个J2ME低级界面下的输入法 字库内置在类中 混淆后jar包40K左右 输入法实现了最基本的功能 像拼音 英文大小写 数字 标点 文字显示框为多行编辑模式 在以后的版本更新中会增加触摸屏的支持 输入...
Canvas是J2ME提供的一种基本绘图界面,它不支持标准的用户输入控件,因此在Canvas上实现汉字输入并不直观,但并非不可能。 J2ME通常使用高级界面(如WTK的 Jadlet 或 LWUIT)来调用设备的系统输入法,这些高级界面...
**J2ME+UI框架LWUIT开发手册** 在移动设备技术发展早期,Java 2 Micro Edition(J2ME)是开发嵌入式系统和移动设备应用的主要平台。其中, Lightweight User Interface Toolkit(LWUIT)是Oracle公司推出的一个开源...
MIE提供了一套基本的UI组件,包括文本标签、文本框、文本域、按钮、单选框、复选框、下拉菜单、对话框、菜单、进度条、分栏组件等。UI组件具有简洁、清爽的风格,并且使用简单方便,用户可以通过对组件Style对象的...
标题中的“j2me低级界面字符串自动换行代码包”指的是在Java 2 Micro Edition (J2ME)平台上,针对图形用户界面(GUI)开发的一种解决方案,它涉及到字符串处理和显示,特别是在有限的屏幕空间内自动进行换行。J2ME是...
在本文中,我们将深入探讨如何使用Java Micro Edition (J2ME) 的低级Canvas组件来实现一个九宫图。九宫图,也被称为九宫格,是一种常见的布局方式,常用于游戏、菜单系统或者简单的用户界面设计。在手机平台上,J2ME...
《J2ME UI控件详解:FATCAT_Snail_GUI_2.1深度解析》 J2ME,全称Java Micro Edition,是Java平台的一个重要分支,主要用于嵌入式设备和移动设备上的应用程序开发。在J2ME中,用户界面(UI)的设计和实现对于提升...
本篇将深入探讨 J2ME UI 的低级界面开发实例,包括图片加载和按钮选择等功能。 首先,我们要理解 J2ME UI 开发的基础组件,主要由 MIDP (Mobile Information Device Profile) 提供。MIDP 包含了 CLDC (Connected ...