BaseViewerActivity.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package com.poqop.document;
  2. import android.app.Activity;
  3. import android.app.Dialog;
  4. import android.content.SharedPreferences;
  5. import android.os.Bundle;
  6. import android.view.Gravity;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.MotionEvent;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.view.Window;
  13. import android.view.animation.AccelerateInterpolator;
  14. import android.view.animation.Animation;
  15. import android.view.animation.AnimationSet;
  16. import android.view.animation.ScaleAnimation;
  17. import android.widget.FrameLayout;
  18. import android.widget.ImageView;
  19. import android.widget.LinearLayout;
  20. import android.widget.LinearLayout.LayoutParams;
  21. import android.widget.Toast;
  22. import com.poqop.R;
  23. import com.poqop.document.events.CurrentPageListener;
  24. import com.poqop.document.events.DecodingProgressListener;
  25. import com.poqop.document.models.CurrentPageModel;
  26. import com.poqop.document.models.DecodingProgressModel;
  27. import com.poqop.document.models.ZoomModel;
  28. import com.poqop.document.views.PageViewZoomControls;
  29. public abstract class BaseViewerActivity extends Activity implements DecodingProgressListener, CurrentPageListener
  30. {
  31. private static final int MENU_EXIT = 0;
  32. private static final int MENU_GOTO = 1;
  33. private static final int DIALOG_GOTO = 0;
  34. private static final String DOCUMENT_VIEW_STATE_PREFERENCES = "DjvuDocumentViewState";
  35. private DecodeService decodeService;
  36. private DocumentView documentView;
  37. private ViewerPreferences viewerPreferences;
  38. private Toast pageNumberToast;
  39. private CurrentPageModel currentPageModel;
  40. private static final int MAX_VALUE = 3800; //设置放大的最大倍数
  41. private static final float MULTIPLIER = 400.0f;
  42. public ZoomModel zoomModel;
  43. float lastX;
  44. float lastY;
  45. float magnify=1.0f; //放大
  46. float reduce=1.0f; //缩小
  47. LinearLayout zoom; //自定义一个linearlayout用来存放两个缩放按钮
  48. /**
  49. * Called when the activity is first created.
  50. */
  51. @Override
  52. public void onCreate(Bundle savedInstanceState)
  53. {
  54. super.onCreate(savedInstanceState);
  55. initDecodeService();
  56. final ZoomModel zoomModel = new ZoomModel();
  57. final DecodingProgressModel progressModel = new DecodingProgressModel();
  58. progressModel.addEventListener(this);
  59. currentPageModel = new CurrentPageModel();
  60. currentPageModel.addEventListener(this);
  61. documentView = new DocumentView(this, zoomModel, progressModel, currentPageModel);
  62. zoomModel.addEventListener(documentView);
  63. documentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
  64. decodeService.setContentResolver(getContentResolver());
  65. decodeService.setContainerView(documentView);
  66. documentView.setDecodeService(decodeService);
  67. decodeService.open(getIntent().getData());
  68. this.zoomModel = zoomModel;
  69. ImageView zoomIn,zoomOut;
  70. viewerPreferences = new ViewerPreferences(this);
  71. /*
  72. * 放大按鈕圖片進行放大
  73. */
  74. zoom=new LinearLayout(this);
  75. zoom.setVisibility(View.GONE);
  76. zoom.setOrientation(LinearLayout.HORIZONTAL);
  77. zoom.setLayoutParams(new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
  78. LinearLayout.LayoutParams.WRAP_CONTENT));
  79. /*
  80. * 縮小按鈕圖片進行縮小
  81. */
  82. zoomOut=new ImageView(this);
  83. zoomOut.setImageResource(R.drawable.gallery_zoom_out_touch);
  84. zoomOut.setLayoutParams(new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
  85. LinearLayout.LayoutParams.WRAP_CONTENT));
  86. zoomOut.setOnTouchListener(new View.OnTouchListener() {
  87. public boolean onTouch(View v, MotionEvent event) {
  88. System.out.println("寬"+zoom.getWidth());
  89. System.out.println("高:"+zoom.getHeight());
  90. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  91. case MotionEvent.ACTION_DOWN:
  92. lastX = event.getX();
  93. setCurrentValue(getToureduceCurrentValues() - (event.getX() - lastX));
  94. break;
  95. }
  96. return true;
  97. }
  98. });
  99. zoomIn=new ImageView(this);
  100. zoomIn.setImageResource(R.drawable.gallery_zoom_in_touch);
  101. zoomIn.setOnTouchListener(new View.OnTouchListener() {
  102. public boolean onTouch(View v, MotionEvent event) {
  103. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  104. case MotionEvent.ACTION_DOWN:
  105. lastX = event.getX();
  106. setCurrentValue(getToumagnifyCurrentValues() - (event.getX() - lastX));
  107. break;
  108. }
  109. return true;
  110. }
  111. });
  112. zoom.addView(zoomOut); //将两个按钮添加到一个小布局中
  113. zoom.addView(zoomIn);
  114. final FrameLayout frameLayout = createMainContainer();
  115. frameLayout.addView(documentView);
  116. frameLayout.addView(zoom); //將两个按钮添加到总布局中去
  117. frameLayout.addView(createZoomControls(zoomModel));
  118. setFullScreen();
  119. setContentView(frameLayout);
  120. final SharedPreferences sharedPreferences = getSharedPreferences(DOCUMENT_VIEW_STATE_PREFERENCES, 0);
  121. documentView.goToPage(sharedPreferences.getInt(getIntent().getData().toString(), 0));
  122. documentView.showDocument();
  123. documentView.setOnClickListener(new View.OnClickListener() {
  124. public void onClick(View v) {
  125. zoom.setVisibility(View.VISIBLE);
  126. }
  127. });
  128. viewerPreferences.addRecent(getIntent().getData());
  129. }
  130. // 放大
  131. public float getToumagnifyCurrentValues() {
  132. float mv = (zoomModel.getZoom() - 0.5f) * 400;
  133. return mv;
  134. }
  135. // 缩小
  136. public float getToureduceCurrentValues() {
  137. float mv = (zoomModel.getZoom() - 1.0f) * 200;
  138. return mv;
  139. }
  140. public void setCurrentValue(float currentValue) {
  141. if (currentValue < 0.0)
  142. currentValue = 0.0f;
  143. if (currentValue > MAX_VALUE)
  144. currentValue = MAX_VALUE;
  145. final float zoom = 1.0f + currentValue / MULTIPLIER;
  146. zoomModel.setZoom(zoom);
  147. }
  148. public void decodingProgressChanged(final int currentlyDecoding)
  149. {
  150. runOnUiThread(new Runnable()
  151. {
  152. public void run()
  153. {
  154. getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, currentlyDecoding == 0 ? 10000 : currentlyDecoding);
  155. }
  156. });
  157. }
  158. public void currentPageChanged(int pageIndex)
  159. {
  160. final String pageText = (pageIndex + 1) + "/" + decodeService.getPageCount();
  161. if (pageNumberToast != null)
  162. {
  163. pageNumberToast.setText(pageText);
  164. }
  165. else
  166. {
  167. pageNumberToast = Toast.makeText(this, pageText, 300);
  168. }
  169. pageNumberToast.setGravity(Gravity.TOP | Gravity.LEFT,0,0);
  170. pageNumberToast.show();
  171. saveCurrentPage();
  172. }
  173. private void setWindowTitle()
  174. {
  175. final String name = getIntent().getData().getLastPathSegment();
  176. getWindow().setTitle(name);
  177. }
  178. @Override
  179. protected void onPostCreate(Bundle savedInstanceState)
  180. {
  181. super.onPostCreate(savedInstanceState);
  182. setWindowTitle();
  183. }
  184. /*
  185. * 设置全屏
  186. */
  187. private void setFullScreen()
  188. {
  189. if (viewerPreferences.isFullScreen())
  190. {
  191. // getWindow().requestFeature(Window.FEATURE_NO_TITLE);
  192. // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  193. }
  194. else
  195. {
  196. getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); //在标题栏上加入更新进度条
  197. }
  198. }
  199. /*
  200. * 设置缩放栏的位置
  201. */
  202. private PageViewZoomControls createZoomControls(ZoomModel zoomModel)
  203. {
  204. final PageViewZoomControls controls = new PageViewZoomControls(this, zoomModel);
  205. controls.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
  206. zoomModel.addEventListener(controls);
  207. return controls;
  208. }
  209. private FrameLayout createMainContainer()
  210. {
  211. return new FrameLayout(this);
  212. }
  213. private void initDecodeService()
  214. {
  215. if (decodeService == null)
  216. {
  217. decodeService = createDecodeService();
  218. }
  219. }
  220. protected abstract DecodeService createDecodeService();
  221. @Override
  222. protected void onStop()
  223. {
  224. super.onStop();
  225. }
  226. @Override
  227. protected void onDestroy() {
  228. decodeService.recycle();
  229. decodeService = null;
  230. super.onDestroy();
  231. }
  232. private void saveCurrentPage()
  233. {
  234. final SharedPreferences sharedPreferences = getSharedPreferences(DOCUMENT_VIEW_STATE_PREFERENCES, 0);
  235. final SharedPreferences.Editor editor = sharedPreferences.edit();
  236. editor.putInt(getIntent().getData().toString(), documentView.getCurrentPage());
  237. editor.commit();
  238. }
  239. @Override
  240. public boolean onCreateOptionsMenu(Menu menu)
  241. {
  242. menu.add(0, MENU_EXIT, 0, "退出");
  243. menu.add(0, MENU_GOTO, 0, "跳转");
  244. // final MenuItem menuItem = menu.add(0, MENU_FULL_SCREEN, 0, "Full screen").setCheckable(true).setChecked(viewerPreferences.isFullScreen());
  245. // setFullScreenMenuItemText(menuItem);
  246. return true;
  247. }
  248. private void setFullScreenMenuItemText(MenuItem menuItem)
  249. {
  250. menuItem.setTitle("Full screen " + (menuItem.isChecked() ? "on" : "off"));
  251. }
  252. @Override
  253. public boolean onOptionsItemSelected(MenuItem item)
  254. {
  255. switch (item.getItemId())
  256. {
  257. case MENU_EXIT:
  258. System.exit(0);
  259. return true;
  260. case MENU_GOTO:
  261. showDialog(DIALOG_GOTO);
  262. return true;
  263. }
  264. return false;
  265. }
  266. @Override
  267. protected Dialog onCreateDialog(int id)
  268. {
  269. switch (id)
  270. {
  271. case DIALOG_GOTO:
  272. return new GoToPageDialog(this, documentView, decodeService);
  273. }
  274. return null;
  275. }
  276. }