PreviewView.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. package com.epson.cameracopy.printlayout;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.Canvas;
  5. import android.graphics.ColorMatrix;
  6. import android.graphics.ColorMatrixColorFilter;
  7. import android.graphics.Matrix;
  8. import android.graphics.Paint;
  9. import android.graphics.Rect;
  10. import android.os.Bundle;
  11. import android.support.p000v4.view.GestureDetectorCompat;
  12. import android.util.AttributeSet;
  13. import android.view.GestureDetector;
  14. import android.view.MotionEvent;
  15. import android.view.ScaleGestureDetector;
  16. import android.view.View;
  17. import org.opencv.videoio.Videoio;
  18. import epson.common.ImageUtil;
  19. import epson.common.Info_paper;
  20. public class PreviewView extends View {
  21. private static final int BORDER_AREA_COLOR = -1;
  22. private static final ColorMatrixColorFilter[] COLOR_FILTER = {new ColorMatrixColorFilter(new ColorMatrix(colorMatrix)), new ColorMatrixColorFilter(new ColorMatrix(monoMatrix)), new ColorMatrixColorFilter(new ColorMatrix(sepiaMatrix))};
  23. private static final float MANUSCRIPT_FRAME_BORDER_SIZE_DP = 1.5f;
  24. private static final int MANUSCRIPT_FRAME_COLOR = -1057030144;
  25. private static final int PAPER_AREA_COLOR = -1;
  26. private static final float[] colorMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f};
  27. private static final float[] monoMatrix = {0.298912f, 0.586611f, 0.114478f, 0.0f, 0.0f, 0.298912f, 0.586611f, 0.114478f, 0.0f, 0.0f, 0.298912f, 0.586611f, 0.114478f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f};
  28. private static final float[] sepiaMatrix = {0.11747242f, 0.45110387f, 0.021636343f, 0.0f, 0.0f, 0.10432029f, 0.40241516f, 0.019232305f, 0.0f, 0.0f, 0.050217215f, 0.31325027f, 0.014996618f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f};
  29. private Bitmap mBitmap;
  30. private final Paint mBitmapPaint;
  31. private boolean mBorderlessMode;
  32. private float mDpToPixelScale;
  33. private final GestureDetectorCompat mGestureDetector;
  34. private String mImageFileName;
  35. private boolean mIsMoving;
  36. private boolean mIsPrintPositionResetRequired;
  37. private float[] mLinePoints;
  38. private final Matrix mMatrix;
  39. private final Paint mPaint;
  40. private int mPapaerSizeId;
  41. private PreviewPosition mPreviewPosition;
  42. private PrttargetScaleChangeListener mPrttargetScaleChangeListener;
  43. private final ScaleGestureDetector mScaleGestureDetector;
  44. public interface PrttargetScaleChangeListener {
  45. void onPrttargetScaleChange(double d);
  46. }
  47. public static class SizeAndPosition {
  48. public int height;
  49. public int offsetX;
  50. public int offsetY;
  51. public int rotation;
  52. public int width;
  53. public SizeAndPosition(int i, int i2, int i3, int i4, int i5) {
  54. width = i;
  55. height = i2;
  56. offsetX = i3;
  57. offsetY = i4;
  58. rotation = i5;
  59. }
  60. public SizeAndPosition() {
  61. }
  62. }
  63. public PreviewView(Context context, AttributeSet attributeSet, int i) {
  64. super(context, attributeSet, i);
  65. mBitmapPaint = new Paint();
  66. mMatrix = new Matrix();
  67. mPapaerSizeId = -1;
  68. mGestureDetector = new GestureDetectorCompat(context, new MyGestureListener(this));
  69. mGestureDetector.setIsLongpressEnabled(false);
  70. mScaleGestureDetector = new ScaleGestureDetector(context, new MyScaledGestureListener(this));
  71. mPaint = new Paint();
  72. mLinePoints = new float[16];
  73. mPreviewPosition = new PreviewPosition();
  74. mDpToPixelScale = context.getResources().getDisplayMetrics().density;
  75. }
  76. public PreviewView(Context context, AttributeSet attributeSet) {
  77. this(context, attributeSet, 0);
  78. }
  79. public PreviewView(Context context) {
  80. this(context, (AttributeSet) null, 0);
  81. }
  82. public boolean onTouchEvent(MotionEvent motionEvent) {
  83. boolean z = mGestureDetector.onTouchEvent(motionEvent) || mScaleGestureDetector.onTouchEvent(motionEvent);
  84. if (motionEvent.getActionMasked() == 1) {
  85. setMoving(false);
  86. invalidate();
  87. }
  88. if (z || super.onTouchEvent(motionEvent)) {
  89. return true;
  90. }
  91. return false;
  92. }
  93. protected void onDraw(Canvas canvas) {
  94. Rect previewPaperRect = mPreviewPosition.getPreviewPaperRect();
  95. if (previewPaperRect != null) {
  96. mPaint.setColor(-1);
  97. canvas.drawRect(previewPaperRect, mPaint);
  98. }
  99. drawPrintTargetPreview(canvas);
  100. drawOutsidePaperArea(canvas, previewPaperRect);
  101. if (!mBorderlessMode && previewPaperRect != null) {
  102. drawNonPrintableArea(canvas, previewPaperRect, mPreviewPosition.getPaperMaginAnd3mPrintableArea());
  103. }
  104. }
  105. private void drawPrintTargetPreview(Canvas canvas) {
  106. double d;
  107. double d2;
  108. int i;
  109. int i2;
  110. Rect previewPrtimageRect = mPreviewPosition.getPreviewPrtimageRect();
  111. if (previewPrtimageRect != null && mBitmap != null) {
  112. int prtimageRotation = mPreviewPosition.getPrtimageRotation();
  113. mMatrix.reset();
  114. mMatrix.setRotate(((float) prtimageRotation) * 90.0f);
  115. if ((prtimageRotation & 1) != 0) {
  116. d2 = (previewPrtimageRect.width()) / (mBitmap.getHeight());
  117. d = (previewPrtimageRect.height()) / (mBitmap.getWidth());
  118. } else {
  119. d2 = (previewPrtimageRect.width()) / (mBitmap.getWidth());
  120. d = (previewPrtimageRect.height()) / (mBitmap.getHeight());
  121. }
  122. mMatrix.postScale((float) d2, (float) d);
  123. switch (prtimageRotation) {
  124. case 1:
  125. i2 = previewPrtimageRect.width();
  126. i = 0;
  127. break;
  128. case 2:
  129. i2 = previewPrtimageRect.width();
  130. i = previewPrtimageRect.height();
  131. break;
  132. case 3:
  133. i = previewPrtimageRect.height();
  134. i2 = 0;
  135. break;
  136. default:
  137. i2 = 0;
  138. i = 0;
  139. break;
  140. }
  141. mMatrix.postTranslate((float) (previewPrtimageRect.left + i2), (float) (previewPrtimageRect.top + i));
  142. canvas.drawBitmap(mBitmap, mMatrix, mBitmapPaint);
  143. mPaint.setColor(MANUSCRIPT_FRAME_COLOR);
  144. float f = mDpToPixelScale * MANUSCRIPT_FRAME_BORDER_SIZE_DP;
  145. mPaint.setStrokeWidth(f);
  146. float f2 = f / 2.0f;
  147. float f3 = ((float) previewPrtimageRect.bottom) - f2;
  148. float f4 = ((float) previewPrtimageRect.right) - f2;
  149. mLinePoints[0] = (float) previewPrtimageRect.left;
  150. mLinePoints[1] = (float) previewPrtimageRect.top;
  151. mLinePoints[2] = (float) previewPrtimageRect.left;
  152. float[] fArr = mLinePoints;
  153. fArr[3] = f3;
  154. fArr[4] = (float) previewPrtimageRect.left;
  155. float[] fArr2 = mLinePoints;
  156. fArr2[5] = f3;
  157. fArr2[6] = f4;
  158. fArr2[7] = f3;
  159. fArr2[8] = f4;
  160. fArr2[9] = f3;
  161. fArr2[10] = f4;
  162. fArr2[11] = (float) previewPrtimageRect.top;
  163. float[] fArr3 = mLinePoints;
  164. fArr3[12] = f4;
  165. fArr3[13] = (float) previewPrtimageRect.top;
  166. mLinePoints[14] = (float) previewPrtimageRect.left;
  167. mLinePoints[15] = (float) previewPrtimageRect.top;
  168. canvas.drawLines(mLinePoints, mPaint);
  169. }
  170. }
  171. private void drawNonPrintableArea(Canvas canvas, Rect rect, int[] iArr) {
  172. mPaint.setColor(-1);
  173. int i = iArr[0];
  174. int i2 = iArr[1];
  175. int i3 = iArr[2];
  176. int i4 = iArr[3];
  177. Canvas canvas2 = canvas;
  178. canvas2.drawRect((float) rect.left, (float) rect.top, (float) (rect.left + i), (float) rect.bottom, mPaint);
  179. canvas2.drawRect((float) (rect.left + i), (float) rect.top, (float) (rect.left + i + i3), (float) (rect.top + i2), mPaint);
  180. canvas2.drawRect((float) (rect.left + i), (float) (rect.top + i2 + i4), (float) (rect.left + i + i3), (float) rect.bottom, mPaint);
  181. canvas.drawRect((float) (rect.left + i + i3), (float) rect.top, (float) rect.right, (float) rect.bottom, mPaint);
  182. }
  183. private void drawOutsidePaperArea(Canvas canvas, Rect rect) {
  184. mPaint.setColor(getResources().getColor(R.color.background_preview));
  185. if (mIsMoving) {
  186. mPaint.setAlpha(221);
  187. }
  188. float width = (float) getWidth();
  189. float height = (float) getHeight();
  190. Canvas canvas2 = canvas;
  191. canvas2.drawRect(0.0f, 0.0f, (float) rect.left, height, mPaint);
  192. canvas2.drawRect((float) rect.left, 0.0f, (float) rect.right, (float) rect.top, mPaint);
  193. canvas2.drawRect((float) rect.left, (float) rect.bottom, (float) rect.right, height, mPaint);
  194. canvas.drawRect((float) rect.right, 0.0f, width, height, mPaint);
  195. }
  196. protected void onSizeChanged(int i, int i2, int i3, int i4) {
  197. super.onSizeChanged(i, i2, i3, i4);
  198. if (i > 0 && i2 > 0) {
  199. if (i3 <= 0 || i4 <= 0) {
  200. mPreviewPosition.setScreenSize(i, i2);
  201. update();
  202. } else if (i != i3 || i2 != i4) {
  203. mPreviewPosition.changeScreenSize(i, i2);
  204. }
  205. }
  206. }
  207. public void setMoving(boolean z) {
  208. mIsMoving = z;
  209. }
  210. static class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
  211. private final PreviewView mPreviewView;
  212. public MyGestureListener(PreviewView previewView) {
  213. mPreviewView = previewView;
  214. }
  215. public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float f, float f2) {
  216. mPreviewView.setMoving(true);
  217. mPreviewView.mPreviewPosition.move(-(f), -(f2));
  218. mPreviewView.invalidate();
  219. return true;
  220. }
  221. public boolean onDown(MotionEvent motionEvent) {
  222. mPreviewView.setMoving(true);
  223. mPreviewView.invalidate();
  224. return true;
  225. }
  226. public boolean onDoubleTap(MotionEvent motionEvent) {
  227. if (mPreviewView.mPreviewPosition.isFitSize()) {
  228. mPreviewView.mPreviewPosition.resetPrtimagePosition();
  229. mPreviewView.updateScale();
  230. mPreviewView.invalidate();
  231. return true;
  232. }
  233. mPreviewView.mPreviewPosition.fitSize();
  234. mPreviewView.updateScale();
  235. mPreviewView.invalidate();
  236. return true;
  237. }
  238. }
  239. static class MyScaledGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
  240. private double mBaseFactor;
  241. private final PreviewView mPreviewView;
  242. public MyScaledGestureListener(PreviewView previewView) {
  243. mPreviewView = previewView;
  244. }
  245. public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) {
  246. mBaseFactor = mPreviewView.mPreviewPosition.getCurrentPrttargetScale();
  247. return super.onScaleBegin(scaleGestureDetector);
  248. }
  249. public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
  250. mPreviewView.mPreviewPosition.setScaleFactor((scaleGestureDetector.getScaleFactor()) * mBaseFactor);
  251. mPreviewView.updateScale();
  252. mPreviewView.invalidate();
  253. return super.onScale(scaleGestureDetector);
  254. }
  255. }
  256. private void updateScale() {
  257. PrttargetScaleChangeListener prttargetScaleChangeListener = mPrttargetScaleChangeListener;
  258. if (prttargetScaleChangeListener != null) {
  259. prttargetScaleChangeListener.onPrttargetScaleChange(mPreviewPosition.getCurrentPrttargetScale());
  260. }
  261. }
  262. public void setPaperSize(int i) {
  263. if (i != mPapaerSizeId) {
  264. setPaperSizeInternal(i);
  265. }
  266. }
  267. private void setPaperSizeInternal(int i) {
  268. mPapaerSizeId = i;
  269. Info_paper infoPaper = Info_paper.getInfoPaper(getContext(), i);
  270. if (infoPaper != null) {
  271. mPreviewPosition.setPaperSize(infoPaper.getPaper_width(), infoPaper.getPaper_height(), infoPaper.getLeftMargin_border(), infoPaper.getTopMargin_border(), infoPaper.getPaper_width_boder(), infoPaper.getPaper_height_boder(), -infoPaper.getLeftMargin(), -infoPaper.getTopMargin(), infoPaper.getPaper_width_boderless(), infoPaper.getPaper_height_boderless());
  272. mIsPrintPositionResetRequired = true;
  273. }
  274. }
  275. public void setColor(int i) {
  276. ColorMatrixColorFilter colorMatrixColorFilter;
  277. switch (i) {
  278. case 0:
  279. colorMatrixColorFilter = COLOR_FILTER[0];
  280. break;
  281. case 1:
  282. colorMatrixColorFilter = COLOR_FILTER[1];
  283. break;
  284. default:
  285. colorMatrixColorFilter = null;
  286. break;
  287. }
  288. if (colorMatrixColorFilter != null) {
  289. mBitmapPaint.setColorFilter(colorMatrixColorFilter);
  290. }
  291. }
  292. public void rotateImageR90() {
  293. mPreviewPosition.rotateRight90();
  294. invalidate();
  295. }
  296. public void setImage(String str) {
  297. mImageFileName = str;
  298. mIsPrintPositionResetRequired = true;
  299. }
  300. public void setPrintTargetSize(int i, int i2) {
  301. mPreviewPosition.setPrtimageActualSize(i, i2);
  302. mIsPrintPositionResetRequired = true;
  303. }
  304. public void update() {
  305. if (mImageFileName != null && getHeight() > 0 && getWidth() > 0) {
  306. mBitmap = createPreviewBitmap(mImageFileName);
  307. if (mBitmap != null) {
  308. int[] prtImageActualSIze = mPreviewPosition.getPrtImageActualSIze();
  309. int i = 1;
  310. if ((prtImageActualSIze[0] - prtImageActualSIze[1]) * (mBitmap.getWidth() - mBitmap.getHeight()) >= 0) {
  311. i = 0;
  312. }
  313. mPreviewPosition.setPrintTargetAddRotation(i);
  314. if (mIsPrintPositionResetRequired) {
  315. setPaperSizeInternal(mPapaerSizeId);
  316. mPreviewPosition.setBorderless(mBorderlessMode);
  317. mPreviewPosition.resetRotation();
  318. mPreviewPosition.calcSizeAndPositionOnScreen();
  319. mIsPrintPositionResetRequired = false;
  320. updateScale();
  321. }
  322. invalidate();
  323. }
  324. }
  325. }
  326. private Bitmap createPreviewBitmap(String str) {
  327. return ImageUtil.loadBitmap(str, Videoio.CAP_UNICAP, Videoio.CAP_PVAPI, true, true);
  328. }
  329. public void releaseBitmap() {
  330. mBitmap.recycle();
  331. mBitmap = null;
  332. }
  333. public void restoreBitmap() {
  334. String str;
  335. if (mBitmap == null && (str = mImageFileName) != null) {
  336. mBitmap = createPreviewBitmap(str);
  337. }
  338. }
  339. public void setBorderless(boolean z) {
  340. if (mBorderlessMode != z) {
  341. mBorderlessMode = z;
  342. mIsPrintPositionResetRequired = true;
  343. }
  344. }
  345. public void printPostionResetRequest() {
  346. mIsPrintPositionResetRequired = true;
  347. }
  348. public void setPrttargetScaleChangeListener(PrttargetScaleChangeListener prttargetScaleChangeListener) {
  349. mPrttargetScaleChangeListener = prttargetScaleChangeListener;
  350. }
  351. public ImageAndLayout getImageAndLayout() {
  352. return mPreviewPosition.getImageAndLayout(mBorderlessMode);
  353. }
  354. public void saveInstanceState(Bundle bundle, String str) {
  355. bundle.putSerializable(str, mPreviewPosition);
  356. }
  357. public void restoreInstanceState(Bundle bundle, String str) {
  358. mPreviewPosition = (PreviewPosition) bundle.getSerializable(str);
  359. mIsPrintPositionResetRequired = false;
  360. updateScale();
  361. }
  362. }