package com.poqop.document;
import android.content.Context;
import android.graphics.*;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.widget.Scroller;
import com.poqop.document.events.ZoomListener;
import com.poqop.document.models.CurrentPageModel;
import com.poqop.document.models.DecodingProgressModel;
import com.poqop.document.models.ZoomModel;
import com.poqop.document.multitouch.MultiTouchZoom;
import com.poqop.document.multitouch.MultiTouchZoomImpl;
import java.util.HashMap;
import java.util.Map;
public class DocumentView extends View implements ZoomListener {
final ZoomModel zoomModel;
private final CurrentPageModel currentPageModel;
DecodeService decodeService;
private final HashMap<Integer, Page> pages = new HashMap<Integer, Page>();
private boolean isInitialized = false;
private int pageToGoTo;
private float lastX;
private float lastY;
private VelocityTracker velocityTracker;
private final Scroller scroller;
DecodingProgressModel progressModel;
private RectF viewRect;
private boolean inZoom;
private long lastDownEventTime;
private static final int DOUBLE_TAP_TIME = 500;
private MultiTouchZoom multiTouchZoom;
public DocumentView(Context context, final ZoomModel zoomModel, DecodingProgressModel progressModel, CurrentPageModel currentPageModel) {
super(context);
this.zoomModel = zoomModel;
this.progressModel = progressModel;
this.currentPageModel = currentPageModel;
setKeepScreenOn(true);
scroller = new Scroller(getContext());
setFocusable(true);
setFocusableInTouchMode(true);
initMultiTouchZoomIfAvailable(zoomModel);
}
private void initMultiTouchZoomIfAvailable(ZoomModel zoomModel) {
try {
multiTouchZoom = (MultiTouchZoom) Class.forName("org.vudroid.core.multitouch.MultiTouchZoomImpl").getConstructor(ZoomModel.class).newInstance(zoomModel);
} catch (Exception e) {
System.out.println("Multi touch zoom is not available: " + e);
}
}
public void setDecodeService(DecodeService decodeService) {
this.decodeService = decodeService;
}
private void init() {
if (isInitialized) {
return;
}
final int width = decodeService.getEffectivePagesWidth();
final int height = decodeService.getEffectivePagesHeight();
for (int i = 0; i < decodeService.getPageCount(); i++) {
pages.put(i, new Page(this, i));
pages.get(i).setAspectRatio(width, height);
}
isInitialized = true;
invalidatePageSizes();
goToPageImpl(pageToGoTo);
}
private void goToPageImpl(final int toPage) {
scrollTo(0, pages.get(toPage).getTop());
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
// bounds could be not updated
post(new Runnable() {
public void run() {
currentPageModel.setCurrentPageIndex(getCurrentPage());
}
});
if (inZoom) {
return;
}
// on scrollChanged can be called from scrollTo just after new layout applied so we should wait for relayout
post(new Runnable() {
public void run() {
updatePageVisibility();
}
});
}
private void updatePageVisibility() {
for (Page page : pages.values()) {
page.updateVisibility();
}
}
public void commitZoom() {
for (Page page : pages.values()) {
page.invalidate();
}
inZoom = false;
}
public void showDocument() {
// use post to ensure that document view has width and height before decoding begin
post(new Runnable() {
public void run() {
init();
updatePageVisibility();
}
});
}
public void goToPage(int toPage) {
if (isInitialized) {
goToPageImpl(toPage);
} else {
pageToGoTo = toPage;
}
}
public int getCurrentPage() {
for (Map.Entry<Integer, Page> entry : pages.entrySet()) {
if (entry.getValue().isVisible()) {
return entry.getKey();
}
}
return 0;
}
public void zoomChanged(float newZoom, float oldZoom) {
inZoom = true;
stopScroller();
final float ratio = newZoom / oldZoom;
invalidatePageSizes();
scrollTo((int) ((getScrollX() + getWidth() / 2) * ratio - getWidth() / 2), (int) ((getScrollY() + getHeight() / 2) * ratio - getHeight() / 2));
postInvalidate();
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
if (multiTouchZoom != null) {
if (multiTouchZoom.onTouchEvent(ev)) {
return true;
}
if (multiTouchZoom.isResetLastPointAfterZoom()) {
setLastPosition(ev);
multiTouchZoom.setResetLastPointAfterZoom(false);
}
}
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}
velocityTracker.addMovement(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
stopScroller();
setLastPosition(ev);
if (ev.getEventTime() - lastDownEventTime < DOUBLE_TAP_TIME) {
zoomModel.toggleZoomControls();
} else {
lastDownEventTime = ev.getEventTime();
}
break;
case MotionEvent.ACTION_MOVE:
scrollBy((int) (lastX - ev.getX()), (int) (lastY - ev.getY()));
setLastPosition(ev);
break;
case MotionEvent.ACTION_UP:
velocityTracker.computeCurrentVelocity(1000);
scroller.fling(getScrollX(), getScrollY(), (int) -velocityTracker.getXVelocity(), (int) -velocityTracker.getYVelocity(), getLeftLimit(), getRightLimit(), getTopLimit(), getBottomLimit());
velocityTracker.recycle();
velocityTracker = null;
break;
}
return true;
}
private void setLastPosition(MotionEvent ev) {
lastX = ev.getX();
lastY = ev.getY();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_DPAD_RIGHT:
lineByLineMoveTo(1);
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
lineByLineMoveTo(-1);
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
verticalDpadScroll(1);
return true;
case KeyEvent.KEYCODE_DPAD_UP:
verticalDpadScroll(-1);
return true;
}
}
return super.dispatchKeyEvent(event);
}
private void verticalDpadScroll(int direction) {
scroller.startScroll(getScrollX(), getScrollY(), 0, direction * getHeight() / 2);
invalidate();
}
private void lineByLineMoveTo(int direction) {
if (direction == 1 ? getScrollX() == getRightLimit() : getScrollX() == getLeftLimit()) {
scroller.startScroll(getScrollX(), getScrollY(), direction * (getLeftLimit() - getRightLimit()), (int) (direction * pa
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
vudroid android pdf阅读器 源码 (450个子文件)
all-wcprops 2KB
all-wcprops 2KB
all-wcprops 2KB
all-wcprops 1KB
all-wcprops 1KB
all-wcprops 1KB
all-wcprops 1KB
all-wcprops 612B
all-wcprops 560B
all-wcprops 560B
all-wcprops 560B
all-wcprops 545B
all-wcprops 532B
all-wcprops 532B
all-wcprops 532B
all-wcprops 528B
all-wcprops 528B
all-wcprops 528B
all-wcprops 428B
all-wcprops 428B
all-wcprops 428B
all-wcprops 424B
all-wcprops 424B
all-wcprops 424B
all-wcprops 401B
all-wcprops 401B
all-wcprops 401B
all-wcprops 393B
all-wcprops 393B
all-wcprops 393B
all-wcprops 252B
all-wcprops 252B
all-wcprops 252B
all-wcprops 210B
all-wcprops 210B
all-wcprops 210B
all-wcprops 202B
all-wcprops 94B
all-wcprops 94B
all-wcprops 94B
all-wcprops 92B
all-wcprops 92B
all-wcprops 92B
all-wcprops 86B
all-wcprops 86B
all-wcprops 86B
all-wcprops 86B
all-wcprops 86B
all-wcprops 86B
all-wcprops 85B
all-wcprops 83B
all-wcprops 82B
all-wcprops 82B
all-wcprops 82B
all-wcprops 82B
resources.ap_ 46KB
DocumentViewer.apk 1.34MB
proguard.cfg 1KB
DocumentView.class 11KB
DocumentView.class 11KB
DecodeServiceBase.class 10KB
DecodeServiceBase.class 10KB
PageTreeNode.class 8KB
PageTreeNode.class 8KB
BaseViewerActivity.class 8KB
BaseViewerActivity.class 8KB
BaseBrowserActivity.class 5KB
Page.class 4KB
Page.class 4KB
ZoomRoll.class 4KB
ViewerPreferences.class 4KB
ViewerPreferences.class 4KB
BrowserAdapter.class 4KB
PdfPage.class 3KB
PdfPage.class 3KB
GoToPageDialog.class 3KB
UriBrowserAdapter.class 2KB
BaseBrowserActivity.class 2KB
BrowserAdapter.class 2KB
DecodeServiceBase$DecodeTask.class 2KB
DecodeServiceBase$DecodeTask.class 2KB
MainBrowserActivity.class 2KB
MainBrowserActivity.class 2KB
ZoomModel.class 2KB
ZoomModel.class 2KB
PageViewZoomControls.class 2KB
PageViewZoomControls.class 2KB
ZoomRoll.class 2KB
DecodeServiceBase$2.class 2KB
DecodeServiceBase$2.class 2KB
SafeEvent.class 2KB
SafeEvent.class 2KB
PageTreeNode$1$1.class 2KB
PageTreeNode$1$1.class 2KB
MultiTouchZoomImpl.class 2KB
MultiTouchZoomImpl.class 2KB
BaseBrowserActivity$1.class 2KB
UriBrowserAdapter.class 2KB
DecodeServiceBase$1.class 1KB
DecodeServiceBase$1.class 1KB
共 450 条
- 1
- 2
- 3
- 4
- 5
Leespace
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页