package com.kaixinbook; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.widget.ImageButton; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import com.kaixinbook.R; import com.kaixinbook.helper.MarkHelper; import com.kaixinbook.mydialog.MarkDialog; import com.kaixinbook.vo.MarkVo; public class Read extends Activity implements OnClickListener, OnSeekBarChangeListener { private static final String TAG = "Read2"; private static int begin = 0;// ��¼���鼮��ʼλ�� public static Canvas mCurPageCanvas, mNextPageCanvas; private static String word = "";// ��¼��ǰҳ������� private int a = 0, b = 0;// ��¼toolpop��λ�� private TextView bookBtn1, bookBtn2, bookBtn3, bookBtn4; private String bookPath;// ��¼�������·�� private String ccc = null;// ��¼�Ƿ�Ϊ��ݷ�ʽ���� protected long count = 1; private SharedPreferences.Editor editor; private ImageButton imageBtn2, imageBtn3_1, imageBtn3_2; private ImageButton imageBtn4_1, imageBtn4_2; private Boolean isNight; // ����ģʽ,��������� protected int jumpPage;// ��¼��ת������ private int light; // ����ֵ private WindowManager.LayoutParams lp; private TextView markEdit4; private MarkHelper markhelper; private Bitmap mCurPageBitmap, mNextPageBitmap; private MarkDialog mDialog = null; private Context mContext = null; private PageWidget mPageWidget; private PopupWindow mPopupWindow, mToolpop, mToolpop1, mToolpop2, mToolpop3, mToolpop4; protected int PAGE = 1; private BookPageFactory pagefactory; private View popupwindwow, toolpop, toolpop1, toolpop2, toolpop3, toolpop4; int screenHeight; int readHeight; // ��������ʾ�߶� int screenWidth; private SeekBar seekBar1, seekBar2, seekBar4; private Boolean show = false;// popwindow�Ƿ���ʾ private int size = 30; // �����С private SharedPreferences sp; int defaultSize = 0; // ʵ����Handler public Handler mHandler = new Handler() { // �������̷߳�������Ϣ��ͬʱ����UI public void handleMessage(Message msg) { switch (msg.what) { case 0: begin = msg.arg1; pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufEnd(begin); postInvalidateUI(); break; case 1: pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufEnd(begin); postInvalidateUI(); break; default: break; } } }; /** * ��¼���� �����popupwindow */ private void clear() { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); show = false; mPopupWindow.dismiss(); popDismiss(); } /** * ��ȡ�����ļ�������ֵ */ private void getLight() { light = sp.getInt("light", 5); isNight = sp.getBoolean("night", false); } /** * ��ȡ�����ļ��������С */ private void getSize() { size = sp.getInt("size", defaultSize); } @Override public void onClick(View v) { switch (v.getId()) { // ���尴ť case R.id.bookBtn1: a = 1; setToolPop(a); break; // ���Ȱ�ť case R.id.bookBtn2: a = 2; setToolPop(a); break; // ��ǩ��ť case R.id.bookBtn3: a = 3; setToolPop(a); break; // ��ת��ť case R.id.bookBtn4: a = 4; setToolPop(a); break; // ҹ��ģʽ��ť case R.id.imageBtn2: if (isNight) { pagefactory.setM_textColor(Color.rgb(28, 28, 28)); imageBtn2.setImageResource(R.drawable.reader_switch_off); isNight = false; pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.bg)); } else { pagefactory.setM_textColor(Color.rgb(128, 128, 128)); imageBtn2.setImageResource(R.drawable.reader_switch_on); isNight = true; pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.main_bg)); } setLight(); pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufEnd(begin); postInvalidateUI(); break; // �����ǩ��ť case R.id.imageBtn3_1: SQLiteDatabase db = markhelper.getWritableDatabase(); try { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm ss"); String time = sf.format(new Date()); db.execSQL("insert into markhelper (path ,begin,word,time) values (?,?,?,?)", new String[] { bookPath, begin + "", word, time }); db.close(); Toast.makeText(Read.this, "��ǩ��ӳɹ�", Toast.LENGTH_SHORT).show(); } catch (SQLException e) { Toast.makeText(Read.this, "����ǩ�Ѵ���", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(Read.this, "�����ǩʧ��", Toast.LENGTH_SHORT).show(); } mToolpop.dismiss(); mToolpop3.dismiss(); break; // �ҵ���ǩ��ť case R.id.imageBtn3_2: SQLiteDatabase dbSelect = markhelper.getReadableDatabase(); String col[] = { "begin", "word", "time" }; Cursor cur = dbSelect.query("markhelper", col, "path = '" + bookPath + "'", null, null, null, null); Integer num = cur.getCount(); if (num == 0) { Toast.makeText(Read.this, "����û����ǩ", Toast.LENGTH_SHORT).show(); } else { ArrayList<MarkVo> markList = new ArrayList<MarkVo>(); while (cur.moveToNext()) { String s1 = cur.getString(cur.getColumnIndex("word")); String s2 = cur.getString(cur.getColumnIndex("time")); int b1 = cur.getInt(cur.getColumnIndex("begin")); int p = 0; int count = 10; MarkVo mv = new MarkVo(s1, p, count, b1, s2, bookPath); markList.add(mv); } mDialog = new MarkDialog(this, markList, mHandler, R.style.FullHeightDialog); mDialog.setCancelable(false); mDialog.setTitle("�ҵ���ǩ"); mDialog.show(); } dbSelect.close(); cur.close(); mToolpop.dismiss(); mToolpop3.dismiss(); break; case R.id.imageBtn4_1: clear(); pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufEnd(begin); postInvalidateUI(); break; case R.id.imageBtn4_2: clear(); break; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); mContext = getBaseContext(); WindowManager manage = getWindowManager(); Display display = manage.getDefaultDisplay(); screenWidth = display.getWidth(); screenHeight = display.getHeight(); defaultSize = (screenWidth * 20) / 320; readHeight = screenHeight - (50 * screenWidth) / 320; mCurPageBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); mNextPageBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); mCurPageCanvas = new Canvas(mCurPageBitmap); mNextPageCanvas = new Canvas(mNextPageBitmap); mPageWidget = new PageWidget(this, screenWidth, readHeight);// ҳ�� setContentView(R.layout.read); RelativeLayout rlayout = (RelativeLayout) findViewById(R.id.readlayout); rlayout.addView(mPageWidget); Intent intent = getIntent(); bookPath = intent.getStringExtra("aaa"); ccc = intent.getStringExtra("ccc"); mPageWidget.setBitmaps(mCurPageBitmap, mCurPageBitmap); mPageWidget.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent e) { boolean ret = false; if (v == mPageWidget) { if (!show) { if (e.getAction() == MotionEvent.ACTION_DOWN) { if (e.getY() > readHeight) {// ������Χ�ˣ���ʾ�������������������ҳ return false; } mPageWidget.abortAnimation(); mPageWidget.calcCornerXY(e.getX(), e.getY()); pagefactory.onDraw(mCurPageCanvas); if (mPageWidget.DragToRight()) {// �� try { pagefactory.prePage(); begin = pagefactory.getM_mbBufBegin();// ��ȡ��ǰ�Ķ�λ�� word = pagefactory.getFirstLineText();// ��ȡ��ǰ�Ķ�λ�õ��������� } catch (IOException e1) { Log.e(TAG, "onTouch->prePage error", e1); } if (pagefactory.isfirstPage()) { Toast.makeText(mContext, "��ǰ�ǵ�һҳ", Toast.LENGTH_SHORT).show(); return false; } pagefactory.onDraw(mNextPageCanvas); } else {// �ҷ� try { pagefactory.nextPage(); begin = pagefactory.getM_mbBufBegin();// ��ȡ��ǰ�Ķ�λ�� word = pagefactory.getFirstLineText();// ��ȡ��ǰ�Ķ�λ�õ��������� } catch (IOException e1) { Log.e(TAG, "onTouch->nextPage error", e1); } if (pagefactory.islastPage()) { Toast.makeText(mContext, "�Ѿ������һҳ��", Toast.LENGTH_SHORT).show(); return false; } pagefactory.onDraw(mNextPageCanvas); } mPageWidget.setBitmaps(mCurPageBitmap, mNextPageBitmap); } editor.putInt(bookPath + "begin", begin).commit(); ret = mPageWidget.doTouchEvent(e); return ret; } } return false; } }); setPop(); // ��ȡ��¼��sharedpreferences�ĸ���״̬ sp = getSharedPreferences("config", MODE_PRIVATE); editor = sp.edit(); getSize();// ��ȡ�����ļ��е�size��С getLight();// ��ȡ�����ļ��е�lightֵ count = sp.getLong(bookPath + "count", 1); lp = getWindow().getAttributes(); lp.screenBrightness = light / 10.0f < 0.01f ? 0.01f : light / 10.0f; getWindow().setAttributes(lp); pagefactory = new BookPageFactory(screenWidth, readHeight);// �鹤�� if (isNight) { pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.main_bg)); pagefactory.setM_textColor(Color.rgb(128, 128, 128)); } else { pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.bg)); pagefactory.setM_textColor(Color.rgb(28, 28, 28)); } begin = sp.getInt(bookPath + "begin", 0); try { pagefactory.openbook(bookPath, begin);// ��ָ��λ�ô��鼮��Ĭ�ϴӿ�ʼ�� pagefactory.setM_fontSize(size); pagefactory.onDraw(mCurPageCanvas); } catch (IOException e1) { Log.e(TAG, "�򿪵�����ʧ��", e1); Toast.makeText(this, "�򿪵�����ʧ��", Toast.LENGTH_SHORT).show(); } markhelper = new MarkHelper(this); } @Override protected void onDestroy() { super.onDestroy(); pagefactory = null; mPageWidget = null; finish(); } /** * �ж��Ǵ��ĸ���������READ */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (ccc == null) { if (show) {// ���popwindow������ʾ popDismiss(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); show = false; mPopupWindow.dismiss(); } else { Read.this.finish(); } } else { if (!ccc.equals("ccc")) { if (show) {// ���popwindow������ʾ getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); show = false; mPopupWindow.dismiss(); popDismiss(); } else { this.finish(); } } else { this.finish(); } } } return true; } /** * ��Ӷ�menu��ť�ļ��� */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { if (show) { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); show = false; mPopupWindow.dismiss(); popDismiss(); } else { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); show = true; pop(); } } return super.onKeyUp(keyCode, event); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { switch (seekBar.getId()) { // ��������� case R.id.seekBar1: size = seekBar1.getProgress() + 15; setSize(); pagefactory.setM_fontSize(size); pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufEnd(begin); postInvalidateUI(); break; // ���Ƚ����� case R.id.seekBar2: light = seekBar2.getProgress(); setLight(); lp.screenBrightness = light / 10.0f < 0.01f ? 0.01f : light / 10.0f; getWindow().setAttributes(lp); break; // ��ת������ case R.id.seekBar4: int s = seekBar4.getProgress(); markEdit4.setText(s + "%"); begin = (pagefactory.getM_mbBufLen() * s) / 100; editor.putInt(bookPath + "begin", begin).commit(); pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufEnd(begin); try { if (s == 100) { pagefactory.prePage(); pagefactory.getM_mbBufBegin(); begin = pagefactory.getM_mbBufEnd(); pagefactory.setM_mbBufBegin(begin); pagefactory.setM_mbBufBegin(begin); } } catch (IOException e) { Log.e(TAG, "onProgressChanged seekBar4-> IOException error", e); } postInvalidateUI(); break; } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } /** * popupwindow�ĵ���,������ */ public void pop() { mPopupWindow.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, 0); bookBtn1 = (TextView) popupwindwow.findViewById(R.id.bookBtn1); bookBtn2 = (TextView) popupwindwow.findViewById(R.id.bookBtn2); bookBtn3 = (TextView) popupwindwow.findViewById(R.id.bookBtn3); bookBtn4 = (TextView) popupwindwow.findViewById(R.id.bookBtn4); bookBtn1.setOnClickListener(this); bookBtn2.setOnClickListener(this); bookBtn3.setOnClickListener(this); bookBtn4.setOnClickListener(this); } /** * �ر�55������pop */ public void popDismiss() { mToolpop.dismiss(); mToolpop1.dismiss(); mToolpop2.dismiss(); mToolpop3.dismiss(); mToolpop4.dismiss(); } /** * ��¼�����ļ�������ֵ�ͺ����� */ private void setLight() { try { light = seekBar2.getProgress(); editor.putInt("light", light); if (isNight) { editor.putBoolean("night", true); } else { editor.putBoolean("night", false); } editor.commit(); } catch (Exception e) { Log.e(TAG, "setLight-> Exception error", e); } } /** * ��ʼ������POPUPWINDOW */ private void setPop() { popupwindwow = this.getLayoutInflater().inflate(R.layout.bookpop, null); toolpop = this.getLayoutInflater().inflate(R.layout.toolpop, null); mPopupWindow = new PopupWindow(popupwindwow, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); mToolpop = new PopupWindow(toolpop, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); toolpop1 = this.getLayoutInflater().inflate(R.layout.tool11, null); mToolpop1 = new PopupWindow(toolpop1, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); toolpop2 = this.getLayoutInflater().inflate(R.layout.tool22, null); mToolpop2 = new PopupWindow(toolpop2, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); toolpop3 = this.getLayoutInflater().inflate(R.layout.tool33, null); mToolpop3 = new PopupWindow(toolpop3, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); toolpop4 = this.getLayoutInflater().inflate(R.layout.tool44, null); mToolpop4 = new PopupWindow(toolpop4, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); } /** * ��¼�����ļ��������С */ private void setSize() { try { size = seekBar1.getProgress() + 15; editor.putInt("size", size); editor.commit(); } catch (Exception e) { Log.e(TAG, "setSize-> Exception error", e); } } /** * ����popupwindow����ʾ������ * * @param a */ public void setToolPop(int a) { if (a == b && a != 0) { if (mToolpop.isShowing()) { popDismiss(); } else { mToolpop.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); // ��������尴ť if (a == 1) { mToolpop1.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); seekBar1 = (SeekBar) toolpop1.findViewById(R.id.seekBar1); size = sp.getInt("size", 20); seekBar1.setProgress((size - 15)); seekBar1.setOnSeekBarChangeListener(this); } // ��������Ȱ�ť if (a == 2) { mToolpop2.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); seekBar2 = (SeekBar) toolpop2.findViewById(R.id.seekBar2); imageBtn2 = (ImageButton) toolpop2.findViewById(R.id.imageBtn2); getLight(); seekBar2.setProgress(light); if (isNight) { imageBtn2.setImageResource(R.drawable.reader_switch_on); } else { imageBtn2.setImageResource(R.drawable.reader_switch_off); } imageBtn2.setOnClickListener(this); seekBar2.setOnSeekBarChangeListener(this); } // �������ǩ��ť if (a == 3) { mToolpop3.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, toolpop.getHeight()); imageBtn3_1 = (ImageButton) toolpop3.findViewById(R.id.imageBtn3_1); imageBtn3_2 = (ImageButton) toolpop3.findViewById(R.id.imageBtn3_2); imageBtn3_1.setOnClickListener(this); imageBtn3_2.setOnClickListener(this); } // �������ת��ť if (a == 4) { mToolpop4.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); imageBtn4_1 = (ImageButton) toolpop4.findViewById(R.id.imageBtn4_1); imageBtn4_2 = (ImageButton) toolpop4.findViewById(R.id.imageBtn4_2); seekBar4 = (SeekBar) toolpop4.findViewById(R.id.seekBar4); markEdit4 = (TextView) toolpop4.findViewById(R.id.markEdit4); // begin = sp.getInt(bookPath + "begin", 1); float fPercent = (float) (begin * 1.0 / pagefactory.getM_mbBufLen()); DecimalFormat df = new DecimalFormat("#0"); String strPercent = df.format(fPercent * 100) + "%"; markEdit4.setText(strPercent); seekBar4.setProgress(Integer.parseInt(df.format(fPercent * 100))); seekBar4.setOnSeekBarChangeListener(this); imageBtn4_1.setOnClickListener(this); imageBtn4_2.setOnClickListener(this); } } } else { if (mToolpop.isShowing()) { // �����ݵļ�¼ popDismiss(); } mToolpop.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); // ������尴ť if (a == 1) { mToolpop1.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); seekBar1 = (SeekBar) toolpop1.findViewById(R.id.seekBar1); size = sp.getInt("size", 20); seekBar1.setProgress(size - 15); seekBar1.setOnSeekBarChangeListener(this); } // ������Ȱ�ť if (a == 2) { mToolpop2.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); seekBar2 = (SeekBar) toolpop2.findViewById(R.id.seekBar2); imageBtn2 = (ImageButton) toolpop2.findViewById(R.id.imageBtn2); getLight(); seekBar2.setProgress(light); if (isNight) { pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.main_bg)); } else { pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.bg)); } if (isNight) { imageBtn2.setImageResource(R.drawable.reader_switch_on); } else { imageBtn2.setImageResource(R.drawable.reader_switch_off); } imageBtn2.setOnClickListener(this); seekBar2.setOnSeekBarChangeListener(this); } // �����ǩ��ť if (a == 3) { mToolpop3.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); imageBtn3_1 = (ImageButton) toolpop3.findViewById(R.id.imageBtn3_1); imageBtn3_2 = (ImageButton) toolpop3.findViewById(R.id.imageBtn3_2); imageBtn3_1.setOnClickListener(this); imageBtn3_2.setOnClickListener(this); } // �����ת��ť if (a == 4) { mToolpop4.showAtLocation(mPageWidget, Gravity.BOTTOM, 0, screenWidth * 45 / 320); imageBtn4_1 = (ImageButton) toolpop4.findViewById(R.id.imageBtn4_1); imageBtn4_2 = (ImageButton) toolpop4.findViewById(R.id.imageBtn4_2); seekBar4 = (SeekBar) toolpop4.findViewById(R.id.seekBar4); markEdit4 = (TextView) toolpop4.findViewById(R.id.markEdit4); // jumpPage = sp.getInt(bookPath + "jumpPage", 1); float fPercent = (float) (begin * 1.0 / pagefactory.getM_mbBufLen()); DecimalFormat df = new DecimalFormat("#0"); String strPercent = df.format(fPercent * 100) + "%"; markEdit4.setText(strPercent); seekBar4.setProgress(Integer.parseInt(df.format(fPercent * 100))); seekBar4.setOnSeekBarChangeListener(this); imageBtn4_1.setOnClickListener(this); imageBtn4_2.setOnClickListener(this); } } // ��¼�ϴε��������һ�� b = a; } @Override protected void onPause() { super.onPause(); } /** * ˢ�½��� */ public void postInvalidateUI() { mPageWidget.abortAnimation(); pagefactory.onDraw(mCurPageCanvas); try { pagefactory.currentPage(); begin = pagefactory.getM_mbBufBegin();// ��ȡ��ǰ�Ķ�λ�� word = pagefactory.getFirstLineText();// ��ȡ��ǰ�Ķ�λ�õ��������� } catch (IOException e1) { Log.e(TAG, "postInvalidateUI->IOException error", e1); } pagefactory.onDraw(mNextPageCanvas); mPageWidget.setBitmaps(mCurPageBitmap, mNextPageBitmap); mPageWidget.postInvalidate(); } @Override protected void onResume() { super.onResume(); } }