bin / mupdf / mupdf-1.7 / platform / android / src / com / artifex / mupdfdemo / MuPDFReaderView.java
7859 viewspackage com.artifex.mupdfdemo;12import android.app.Activity;3import android.content.Context;4import android.content.Intent;5import android.net.Uri;6import android.util.AttributeSet;7import android.util.DisplayMetrics;8import android.view.MotionEvent;9import android.view.ScaleGestureDetector;10import android.view.View;11import android.view.WindowManager;1213public class MuPDFReaderView extends ReaderView {14public enum Mode {Viewing, Selecting, Drawing}15private final Context mContext;16private boolean mLinksEnabled = false;17private Mode mMode = Mode.Viewing;18private boolean tapDisabled = false;19private int tapPageMargin;2021protected void onTapMainDocArea() {}22protected void onDocMotion() {}23protected void onHit(Hit item) {};2425public void setLinksEnabled(boolean b) {26mLinksEnabled = b;27resetupChildren();28}2930public void setMode(Mode m) {31mMode = m;32}3334private void setup()35{36// Get the screen size etc to customise tap margins.37// We calculate the size of 1 inch of the screen for tapping.38// On some devices the dpi values returned are wrong, so we39// sanity check it: we first restrict it so that we are never40// less than 100 pixels (the smallest Android device screen41// dimension I've seen is 480 pixels or so). Then we check42// to ensure we are never more than 1/5 of the screen width.43DisplayMetrics dm = new DisplayMetrics();44WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);45wm.getDefaultDisplay().getMetrics(dm);46tapPageMargin = (int)dm.xdpi;47if (tapPageMargin < 100)48tapPageMargin = 100;49if (tapPageMargin > dm.widthPixels/5)50tapPageMargin = dm.widthPixels/5;51}5253public MuPDFReaderView(Context context) {54super(context);55mContext = context;56setup();57}5859public MuPDFReaderView(Context context, AttributeSet attrs)60{61super(context, attrs);62mContext = context;63setup();64}6566public boolean onSingleTapUp(MotionEvent e) {67LinkInfo link = null;6869if (mMode == Mode.Viewing && !tapDisabled) {70MuPDFView pageView = (MuPDFView) getDisplayedView();71Hit item = pageView.passClickEvent(e.getX(), e.getY());72onHit(item);73if (item == Hit.Nothing) {74if (mLinksEnabled && pageView != null75&& (link = pageView.hitLink(e.getX(), e.getY())) != null) {76link.acceptVisitor(new LinkInfoVisitor() {77@Override78public void visitInternal(LinkInfoInternal li) {79// Clicked on an internal (GoTo) link80setDisplayedViewIndex(li.pageNumber);81}8283@Override84public void visitExternal(LinkInfoExternal li) {85Intent intent = new Intent(Intent.ACTION_VIEW, Uri86.parse(li.url));87mContext.startActivity(intent);88}8990@Override91public void visitRemote(LinkInfoRemote li) {92// Clicked on a remote (GoToR) link93}94});95} else if (e.getX() < tapPageMargin) {96super.smartMoveBackwards();97} else if (e.getX() > super.getWidth() - tapPageMargin) {98super.smartMoveForwards();99} else if (e.getY() < tapPageMargin) {100super.smartMoveBackwards();101} else if (e.getY() > super.getHeight() - tapPageMargin) {102super.smartMoveForwards();103} else {104onTapMainDocArea();105}106}107}108return super.onSingleTapUp(e);109}110111@Override112public boolean onDown(MotionEvent e) {113114return super.onDown(e);115}116117public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,118float distanceY) {119MuPDFView pageView = (MuPDFView)getDisplayedView();120switch (mMode) {121case Viewing:122if (!tapDisabled)123onDocMotion();124125return super.onScroll(e1, e2, distanceX, distanceY);126case Selecting:127if (pageView != null)128pageView.selectText(e1.getX(), e1.getY(), e2.getX(), e2.getY());129return true;130default:131return true;132}133}134135@Override136public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,137float velocityY) {138switch (mMode) {139case Viewing:140return super.onFling(e1, e2, velocityX, velocityY);141default:142return true;143}144}145146public boolean onScaleBegin(ScaleGestureDetector d) {147// Disabled showing the buttons until next touch.148// Not sure why this is needed, but without it149// pinch zoom can make the buttons appear150tapDisabled = true;151return super.onScaleBegin(d);152}153154public boolean onTouchEvent(MotionEvent event) {155156if ( mMode == Mode.Drawing )157{158float x = event.getX();159float y = event.getY();160switch (event.getAction())161{162case MotionEvent.ACTION_DOWN:163touch_start(x, y);164break;165case MotionEvent.ACTION_MOVE:166touch_move(x, y);167break;168case MotionEvent.ACTION_UP:169touch_up();170break;171}172}173174if ((event.getAction() & event.getActionMasked()) == MotionEvent.ACTION_DOWN)175{176tapDisabled = false;177}178179return super.onTouchEvent(event);180}181182private float mX, mY;183184private static final float TOUCH_TOLERANCE = 2;185186private void touch_start(float x, float y) {187188MuPDFView pageView = (MuPDFView)getDisplayedView();189if (pageView != null)190{191pageView.startDraw(x, y);192}193mX = x;194mY = y;195}196197private void touch_move(float x, float y) {198199float dx = Math.abs(x - mX);200float dy = Math.abs(y - mY);201if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)202{203MuPDFView pageView = (MuPDFView)getDisplayedView();204if (pageView != null)205{206pageView.continueDraw(x, y);207}208mX = x;209mY = y;210}211}212213private void touch_up() {214215// NOOP216}217218protected void onChildSetup(int i, View v) {219if (SearchTaskResult.get() != null220&& SearchTaskResult.get().pageNumber == i)221((MuPDFView) v).setSearchBoxes(SearchTaskResult.get().searchBoxes);222else223((MuPDFView) v).setSearchBoxes(null);224225((MuPDFView) v).setLinkHighlighting(mLinksEnabled);226227((MuPDFView) v).setChangeReporter(new Runnable() {228public void run() {229applyToChildren(new ReaderView.ViewMapper() {230@Override231void applyToView(View view) {232((MuPDFView) view).update();233}234});235}236});237}238239protected void onMoveToChild(int i) {240if (SearchTaskResult.get() != null241&& SearchTaskResult.get().pageNumber != i) {242SearchTaskResult.set(null);243resetupChildren();244}245}246247@Override248protected void onMoveOffChild(int i) {249View v = getView(i);250if (v != null)251((MuPDFView)v).deselectAnnotation();252}253254protected void onSettle(View v) {255// When the layout has settled ask the page to render256// in HQ257((MuPDFView) v).updateHq(false);258}259260protected void onUnsettle(View v) {261// When something changes making the previous settled view262// no longer appropriate, tell the page to remove HQ263((MuPDFView) v).removeHq();264}265266@Override267protected void onNotInUse(View v) {268((MuPDFView) v).releaseResources();269}270271@Override272protected void onScaleChild(View v, Float scale) {273((MuPDFView) v).setScale(scale);274}275}276277278