闲来自己动手开发了个电子阅读器,算是功能比较简单,阅读txt文档,可以添加书签,搜索。包括:1、可以打开本地文件夹去找到要的书;2、设定背景颜色,字体等等。
这里简要的介绍一下其中的核心代码:
(1)自动滚屏:
Handler autoScrollHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what)
{
case BEGIN_SCROLL:
//需要判断是否已经滚动到最后了
if( tvMain.getScrollY()>= tvMain.getLineCount()*tvMain.getLineHeight()-tvMain.getHeight())
{
tvMain.scrollTo(0, tvMain.getLineCount()*tvMain.getLineHeight()-tvMain.getHeight());
autoScrollHandler.sendEmptyMessage(STOP_SCROLL);
}
else
{
tvMain.scrollTo(0, tvMain.getScrollY() + STOP_SCROLL);
autoScrollHandler.sendEmptyMessageDelayed(BEGIN_SCROLL, 100);
}
break;
case END_SCROLL:
autoScrollHandler.removeMessages(END_SCROLL);
autoScrollHandler.removeMessages(BEGIN_SCROLL);
case STOP_SCROLL:
autoScrollHandler.removeMessages(BEGIN_SCROLL);
autoScrollHandler.removeMessages(STOP_SCROLL);
break;
}
}
};
(2)读书过程中,可以选中进行操作:发短信、打电话
/**
* 用户选择了文本之后,让用户选择要发短信还是打电话
*/
@Override
protected Dialog onCreateDialog(int id)
{
if( id == DIALOG_AFTER_SELECTION)
{
return new AlertDialog.Builder(ReadBookActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
.setMessage("您想用选定的文本:")
.setPositiveButton("发送短信", new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri smsUri=Uri.parse("smsto://");
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
cm.setText(strSelection);
startActivity(smsIntent);
Toast.makeText(ReadBookActivity.this, "短信内容已复制到剪贴板",
Toast.LENGTH_LONG).show();
tvMain.clearSelection();
}
})
.setNegativeButton("拨打电话", new android.content.DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
if( PhoneNumberUtils.isGlobalPhoneNumber(strSelection))
{
Intent phoneIntent=new Intent(Intent.ACTION_CALL,Uri.parse("tel://"+strSelection));
startActivity(phoneIntent);
}
else
{
Toast.makeText(ReadBookActivity.this, "非法的电话号码",
Toast.LENGTH_LONG).show();
}
tvMain.clearSelection();
}
})
.setNegativeButton("取消选择", new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
tvMain.clearSelection();
}
})
.create();
}
return null;
}
(3)遍历文件夹查找对应的文件夹或者文件
/**
* 列出当前目录下的文件
* @param currDict
*/
private void listCurrDictFiles(File currDict)
{
fileAdapter.clearItems();
fileAdapter.notifyDataSetChanged();
fileListview.postInvalidate();
if( !currDict.getPath().equals("/sdcard"))
{
FileListItem item=new FileListItem();
item.name="返回上级";
item.type=FileType_Folder;
fileAdapter.addItem(item);
}
for(File f:currDict.listFiles() )
{
FileListItem item=new FileListItem();
item.name=f.getName();
if( f.isDirectory() && f.isHidden()==false)
{
item.type=FileType_Folder;
item.dirName=f.getPath();
fileAdapter.addItem(item);
}
if( checkExt(item.name.toLowerCase()) )
{
item.type=FileType_Txt;
item.dirName=f.getPath();
fileAdapter.addItem(item);
}
}
fileAdapter.notifyDataSetChanged();
fileListview.postInvalidate();
}
(4)自定义的文本阅读器控件,核心代码:
@Override
public boolean onTouchEvent(MotionEvent event)
{
if( bIsBeginSelecting )
{
int action=event.getAction();
Layout layout=getLayout();
switch(action)
{
case MotionEvent.ACTION_DOWN:
line=layout.getLineForVertical(getScrollY()+(int)event.getY());
off=layout.getOffsetForHorizontal(line, (event.getX()));
Selection.setSelection(getEditableText(), off);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
line = layout.getLineForVertical(getScrollY()+(int)event.getY());
int curOff = layout.getOffsetForHorizontal(line, (int)event.getX());
if (curOff > off)
Selection.setSelection(getEditableText(), off, curOff);
else
Selection.setSelection(getEditableText(), curOff, off);
}
return true;
}
else
{
super.onTouchEvent(event);
return true;
}
}
过几天继续更新,加强功能!
希望多多交流!