ImageShow.java revision bf1677a434760fcb7389a30c18e05cc3e7926d40
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.gallery3d.filtershow.imageshow; 18 19import android.content.Context; 20import android.graphics.Bitmap; 21import android.graphics.Canvas; 22import android.graphics.Color; 23import android.graphics.Paint; 24import android.graphics.Rect; 25import android.graphics.RectF; 26import android.os.Handler; 27import android.util.AttributeSet; 28import android.view.GestureDetector; 29import android.view.GestureDetector.OnDoubleTapListener; 30import android.view.GestureDetector.OnGestureListener; 31import android.view.MotionEvent; 32import android.view.View; 33import android.widget.ArrayAdapter; 34import android.widget.SeekBar; 35import android.widget.SeekBar.OnSeekBarChangeListener; 36 37import com.android.gallery3d.R; 38import com.android.gallery3d.filtershow.FilterShowActivity; 39import com.android.gallery3d.filtershow.HistoryAdapter; 40import com.android.gallery3d.filtershow.ImageStateAdapter; 41import com.android.gallery3d.filtershow.PanelController; 42import com.android.gallery3d.filtershow.cache.ImageLoader; 43import com.android.gallery3d.filtershow.filters.ImageFilter; 44import com.android.gallery3d.filtershow.presets.ImagePreset; 45import com.android.gallery3d.filtershow.ui.SliderController; 46import com.android.gallery3d.filtershow.ui.SliderListener; 47 48import java.io.File; 49 50public class ImageShow extends View implements OnGestureListener, 51 OnDoubleTapListener, 52 SliderListener, 53 OnSeekBarChangeListener { 54 55 private static final String LOGTAG = "ImageShow"; 56 57 protected Paint mPaint = new Paint(); 58 protected static int mTextSize = 24; 59 protected static int mTextPadding = 20; 60 61 protected ImagePreset mImagePreset = null; 62 protected ImagePreset mImageGeometryOnlyPreset = null; 63 protected ImagePreset mImageFiltersOnlyPreset = null; 64 65 protected ImageLoader mImageLoader = null; 66 private ImageFilter mCurrentFilter = null; 67 private boolean mDirtyGeometry = false; 68 69 private Bitmap mBackgroundImage = null; 70 private final boolean USE_BACKGROUND_IMAGE = false; 71 private static int mBackgroundColor = Color.RED; 72 73 private Bitmap mGeometryOnlyImage = null; 74 private Bitmap mFiltersOnlyImage = null; 75 private Bitmap mFilteredImage = null; 76 77 private final boolean USE_SLIDER_GESTURE = false; // set to true to have 78 // slider gesture 79 protected SliderController mSliderController = new SliderController(); 80 81 private GestureDetector mGestureDetector = null; 82 83 private HistoryAdapter mHistoryAdapter = null; 84 private ImageStateAdapter mImageStateAdapter = null; 85 86 private Rect mImageBounds = new Rect(); 87 88 private boolean mTouchShowOriginal = false; 89 private long mTouchShowOriginalDate = 0; 90 private final long mTouchShowOriginalDelayMin = 200; // 200ms 91 private final long mTouchShowOriginalDelayMax = 300; // 300ms 92 private int mShowOriginalDirection = 0; 93 private static int UNVEIL_HORIZONTAL = 1; 94 private static int UNVEIL_VERTICAL = 2; 95 96 private int mTouchDownX = 0; 97 private int mTouchDownY = 0; 98 protected float mTouchX = 0; 99 protected float mTouchY = 0; 100 101 private static int mOriginalTextMargin = 8; 102 private static int mOriginalTextSize = 26; 103 private static String mOriginalText = "Original"; 104 105 protected GeometryMetadata getGeometry() { 106 return new GeometryMetadata(getImagePreset().mGeoData); 107 } 108 109 public void setGeometry(GeometryMetadata d) { 110 getImagePreset().mGeoData.set(d); 111 } 112 113 private boolean mShowControls = false; 114 private boolean mShowOriginal = false; 115 private String mToast = null; 116 private boolean mShowToast = false; 117 private boolean mImportantToast = false; 118 119 private SeekBar mSeekBar = null; 120 private PanelController mController = null; 121 122 private FilterShowActivity mActivity = null; 123 124 public static void setDefaultBackgroundColor(int value) { 125 mBackgroundColor = value; 126 } 127 128 public int getDefaultBackgroundColor() { 129 return mBackgroundColor; 130 } 131 132 public static void setTextSize(int value) { 133 mTextSize = value; 134 } 135 136 public static void setTextPadding(int value) { 137 mTextPadding = value; 138 } 139 140 public static void setOriginalTextMargin(int value) { 141 mOriginalTextMargin = value; 142 } 143 144 public static void setOriginalTextSize(int value) { 145 mOriginalTextSize = value; 146 } 147 148 public static void setOriginalText(String text) { 149 mOriginalText = text; 150 } 151 152 private final Handler mHandler = new Handler(); 153 154 public void select() { 155 if (getCurrentFilter() != null) { 156 int parameter = getCurrentFilter().getParameter(); 157 int maxp = getCurrentFilter().getMaxParameter(); 158 int minp = getCurrentFilter().getMinParameter(); 159 updateSeekBar(parameter, minp, maxp); 160 } 161 if (mSeekBar != null) { 162 mSeekBar.setOnSeekBarChangeListener(this); 163 } 164 } 165 166 private int parameterToUI(int parameter, int minp, int maxp, int uimax) { 167 return (uimax * (parameter - minp)) / (maxp - minp); 168 } 169 170 private int uiToParameter(int ui, int minp, int maxp, int uimax) { 171 return ((maxp - minp) * ui) / uimax + minp; 172 } 173 174 public void updateSeekBar(int parameter, int minp, int maxp) { 175 if (mSeekBar == null) { 176 return; 177 } 178 int seekMax = mSeekBar.getMax(); 179 int progress = parameterToUI(parameter, minp, maxp, seekMax); 180 mSeekBar.setProgress(progress); 181 if (getPanelController() != null) { 182 getPanelController().onNewValue(parameter); 183 } 184 } 185 186 public void unselect() { 187 188 } 189 190 public boolean hasModifications() { 191 if (getImagePreset() == null) { 192 return false; 193 } 194 return getImagePreset().hasModifications(); 195 } 196 197 public void resetParameter() { 198 ImageFilter currentFilter = getCurrentFilter(); 199 if (currentFilter != null) { 200 onNewValue(currentFilter.getDefaultParameter()); 201 } 202 if (USE_SLIDER_GESTURE) { 203 mSliderController.reset(); 204 } 205 } 206 207 public void setPanelController(PanelController controller) { 208 mController = controller; 209 } 210 211 public PanelController getPanelController() { 212 return mController; 213 } 214 215 @Override 216 public void onNewValue(int parameter) { 217 int maxp = 100; 218 int minp = -100; 219 if (getCurrentFilter() != null) { 220 getCurrentFilter().setParameter(parameter); 221 maxp = getCurrentFilter().getMaxParameter(); 222 minp = getCurrentFilter().getMinParameter(); 223 } 224 if (getImagePreset() != null) { 225 mImageLoader.resetImageForPreset(getImagePreset(), this); 226 getImagePreset().fillImageStateAdapter(mImageStateAdapter); 227 } 228 if (getPanelController() != null) { 229 getPanelController().onNewValue(parameter); 230 } 231 updateSeekBar(parameter, minp, maxp); 232 invalidate(); 233 mActivity.enableSave(hasModifications()); 234 } 235 236 @Override 237 public void onTouchDown(float x, float y) { 238 mTouchX = x; 239 mTouchY = y; 240 invalidate(); 241 } 242 243 @Override 244 public void onTouchUp() { 245 } 246 247 public ImageShow(Context context, AttributeSet attrs) { 248 super(context, attrs); 249 if (USE_SLIDER_GESTURE) { 250 mSliderController.setListener(this); 251 } 252 mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row, 253 R.id.rowTextView); 254 mImageStateAdapter = new ImageStateAdapter(context, 255 R.layout.filtershow_imagestate_row); 256 setupGestureDetector(context); 257 mActivity = (FilterShowActivity) context; 258 } 259 260 public ImageShow(Context context) { 261 super(context); 262 if (USE_SLIDER_GESTURE) { 263 mSliderController.setListener(this); 264 } 265 mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row, 266 R.id.rowTextView); 267 setupGestureDetector(context); 268 mActivity = (FilterShowActivity) context; 269 } 270 271 public void setupGestureDetector(Context context) { 272 mGestureDetector = new GestureDetector(context, this); 273 } 274 275 @Override 276 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 277 int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 278 int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 279 setMeasuredDimension(parentWidth, parentHeight); 280 if (USE_SLIDER_GESTURE) { 281 mSliderController.setWidth(parentWidth); 282 mSliderController.setHeight(parentHeight); 283 } 284 } 285 286 public void setSeekBar(SeekBar seekBar) { 287 mSeekBar = seekBar; 288 } 289 290 public void setCurrentFilter(ImageFilter filter) { 291 mCurrentFilter = filter; 292 } 293 294 public ImageFilter getCurrentFilter() { 295 return mCurrentFilter; 296 } 297 298 public void setAdapter(HistoryAdapter adapter) { 299 mHistoryAdapter = adapter; 300 } 301 302 public void showToast(String text) { 303 showToast(text, false); 304 } 305 306 public void showToast(String text, boolean important) { 307 mToast = text; 308 mShowToast = true; 309 mImportantToast = important; 310 invalidate(); 311 312 mHandler.postDelayed(new Runnable() { 313 @Override 314 public void run() { 315 mShowToast = false; 316 invalidate(); 317 } 318 }, 400); 319 } 320 321 public Rect getImageBounds() { 322 Rect dst = new Rect(); 323 getImagePreset().mGeoData.getPhotoBounds().roundOut(dst); 324 return dst; 325 } 326 327 public Rect getDisplayedImageBounds() { 328 return mImageBounds; 329 } 330 331 public ImagePreset getImagePreset() { 332 return mImagePreset; 333 } 334 335 public void drawToast(Canvas canvas) { 336 if (mShowToast && mToast != null) { 337 Paint paint = new Paint(); 338 paint.setTextSize(128); 339 float textWidth = paint.measureText(mToast); 340 int toastX = (int) ((getWidth() - textWidth) / 2.0f); 341 int toastY = (int) (getHeight() / 3.0f); 342 343 paint.setARGB(255, 0, 0, 0); 344 canvas.drawText(mToast, toastX - 2, toastY - 2, paint); 345 canvas.drawText(mToast, toastX - 2, toastY, paint); 346 canvas.drawText(mToast, toastX, toastY - 2, paint); 347 canvas.drawText(mToast, toastX + 2, toastY + 2, paint); 348 canvas.drawText(mToast, toastX + 2, toastY, paint); 349 canvas.drawText(mToast, toastX, toastY + 2, paint); 350 if (mImportantToast) { 351 paint.setARGB(255, 200, 0, 0); 352 } else { 353 paint.setARGB(255, 255, 255, 255); 354 } 355 canvas.drawText(mToast, toastX, toastY, paint); 356 } 357 } 358 359 public void defaultDrawImage(Canvas canvas) { 360 drawImage(canvas, getFilteredImage()); 361 drawPartialImage(canvas, getGeometryOnlyImage()); 362 } 363 364 @Override 365 public void onDraw(Canvas canvas) { 366 drawBackground(canvas); 367 requestFilteredImages(); 368 defaultDrawImage(canvas); 369 370 if (showTitle() && getImagePreset() != null) { 371 mPaint.setARGB(200, 0, 0, 0); 372 mPaint.setTextSize(mTextSize); 373 374 Rect textRect = new Rect(0, 0, getWidth(), mTextSize + mTextPadding); 375 canvas.drawRect(textRect, mPaint); 376 mPaint.setARGB(255, 200, 200, 200); 377 canvas.drawText(getImagePreset().name(), mTextPadding, 378 1.5f * mTextPadding, mPaint); 379 } 380 381 if (showControls()) { 382 if (USE_SLIDER_GESTURE) { 383 mSliderController.onDraw(canvas); 384 } 385 } 386 387 drawToast(canvas); 388 } 389 390 public void resetImageCaches(ImageShow caller) { 391 if (mImageLoader == null) { 392 return; 393 } 394 updateImagePresets(true); 395 } 396 397 public void updateImagePresets(boolean force) { 398 ImagePreset preset = getImagePreset(); 399 if (preset == null) { 400 mActivity.enableSave(false); 401 return; 402 } 403 if (force) { 404 mImageLoader.resetImageForPreset(getImagePreset(), this); 405 } 406 if (force || mImageGeometryOnlyPreset == null) { 407 ImagePreset newPreset = new ImagePreset(preset); 408 newPreset.setDoApplyFilters(false); 409 if (mImageGeometryOnlyPreset == null 410 || !newPreset.same(mImageGeometryOnlyPreset)) { 411 mImageGeometryOnlyPreset = newPreset; 412 mGeometryOnlyImage = null; 413 } 414 } 415 if (force || mImageFiltersOnlyPreset == null) { 416 ImagePreset newPreset = new ImagePreset(preset); 417 newPreset.setDoApplyGeometry(false); 418 if (mImageFiltersOnlyPreset == null 419 || !newPreset.same(mImageFiltersOnlyPreset)) { 420 mImageFiltersOnlyPreset = newPreset; 421 mFiltersOnlyImage = null; 422 } 423 } 424 mActivity.enableSave(hasModifications()); 425 } 426 427 public void requestFilteredImages() { 428 if (mImageLoader != null) { 429 Bitmap bitmap = mImageLoader.getImageForPreset(this, 430 getImagePreset(), showHires()); 431 432 if (bitmap != null) { 433 if (mFilteredImage == null) { 434 invalidate(); 435 } 436 mFilteredImage = bitmap; 437 } 438 439 updateImagePresets(false); 440 if (mImageGeometryOnlyPreset != null) { 441 bitmap = mImageLoader.getImageForPreset(this, mImageGeometryOnlyPreset, 442 showHires()); 443 if (bitmap != null) { 444 mGeometryOnlyImage = bitmap; 445 } 446 } 447 if (mImageFiltersOnlyPreset != null) { 448 bitmap = mImageLoader.getImageForPreset(this, mImageFiltersOnlyPreset, 449 showHires()); 450 if (bitmap != null) { 451 mFiltersOnlyImage = bitmap; 452 } 453 } 454 } 455 456 if (mShowOriginal) { 457 mFilteredImage = mGeometryOnlyImage; 458 } 459 } 460 461 public Bitmap getFiltersOnlyImage() { 462 return mFiltersOnlyImage; 463 } 464 465 public Bitmap getGeometryOnlyImage() { 466 return mGeometryOnlyImage; 467 } 468 469 public Bitmap getFilteredImage() { 470 return mFilteredImage; 471 } 472 473 public void drawImage(Canvas canvas, Bitmap image) { 474 if (image != null) { 475 Rect s = new Rect(0, 0, image.getWidth(), 476 image.getHeight()); 477 478 float scale = GeometryMath.scale(image.getWidth(), image.getHeight(), getWidth(), 479 getHeight()); 480 481 float w = image.getWidth() * scale; 482 float h = image.getHeight() * scale; 483 float ty = (getHeight() - h) / 2.0f; 484 float tx = (getWidth() - w) / 2.0f; 485 486 Rect d = new Rect((int) tx, (int) ty, (int) (w + tx), 487 (int) (h + ty)); 488 mImageBounds = d; 489 canvas.drawBitmap(image, s, d, mPaint); 490 } 491 } 492 493 public void drawPartialImage(Canvas canvas, Bitmap image) { 494 if (!mTouchShowOriginal) 495 return; 496 canvas.save(); 497 if (image != null) { 498 if (mShowOriginalDirection == 0) { 499 if ((mTouchY - mTouchDownY) > (mTouchX - mTouchDownX)) { 500 mShowOriginalDirection = UNVEIL_VERTICAL; 501 } else { 502 mShowOriginalDirection = UNVEIL_HORIZONTAL; 503 } 504 } 505 506 int px = 0; 507 int py = 0; 508 if (mShowOriginalDirection == UNVEIL_VERTICAL) { 509 px = mImageBounds.width(); 510 py = (int) (mTouchY - mImageBounds.top); 511 } else { 512 px = (int) (mTouchX - mImageBounds.left); 513 py = mImageBounds.height(); 514 } 515 516 Rect d = new Rect(mImageBounds.left, mImageBounds.top, 517 mImageBounds.left + px, mImageBounds.top + py); 518 canvas.clipRect(d); 519 drawImage(canvas, image); 520 Paint paint = new Paint(); 521 paint.setColor(Color.BLACK); 522 523 if (mShowOriginalDirection == UNVEIL_VERTICAL) { 524 canvas.drawLine(mImageBounds.left, mTouchY - 1, 525 mImageBounds.right, mTouchY - 1, paint); 526 } else { 527 canvas.drawLine(mTouchX - 1, mImageBounds.top, 528 mTouchX - 1, mImageBounds.bottom, paint); 529 } 530 531 Rect bounds = new Rect(); 532 paint.setTextSize(mOriginalTextSize); 533 paint.getTextBounds(mOriginalText, 0, mOriginalText.length(), bounds); 534 paint.setColor(Color.BLACK); 535 canvas.drawText(mOriginalText, mImageBounds.left + mOriginalTextMargin + 1, 536 mImageBounds.top + bounds.height() + mOriginalTextMargin + 1, paint); 537 paint.setColor(Color.WHITE); 538 canvas.drawText(mOriginalText, mImageBounds.left + mOriginalTextMargin, 539 mImageBounds.top + bounds.height() + mOriginalTextMargin, paint); 540 } 541 canvas.restore(); 542 } 543 544 public void drawBackground(Canvas canvas) { 545 if (USE_BACKGROUND_IMAGE) { 546 if (mBackgroundImage == null) { 547 mBackgroundImage = mImageLoader.getBackgroundBitmap(getResources()); 548 } 549 if (mBackgroundImage != null) { 550 Rect s = new Rect(0, 0, mBackgroundImage.getWidth(), 551 mBackgroundImage.getHeight()); 552 Rect d = new Rect(0, 0, getWidth(), getHeight()); 553 canvas.drawBitmap(mBackgroundImage, s, d, mPaint); 554 } 555 } else { 556 canvas.drawColor(mBackgroundColor); 557 } 558 } 559 560 public ImageShow setShowControls(boolean value) { 561 mShowControls = value; 562 if (mShowControls) { 563 if (mSeekBar != null) { 564 mSeekBar.setVisibility(View.VISIBLE); 565 } 566 } else { 567 if (mSeekBar != null) { 568 mSeekBar.setVisibility(View.INVISIBLE); 569 } 570 } 571 return this; 572 } 573 574 public boolean showControls() { 575 return mShowControls; 576 } 577 578 public boolean showHires() { 579 return true; 580 } 581 582 public boolean showTitle() { 583 return false; 584 } 585 586 public void setImagePreset(ImagePreset preset) { 587 setImagePreset(preset, true); 588 } 589 590 public void setImagePreset(ImagePreset preset, boolean addToHistory) { 591 if (preset == null) { 592 return; 593 } 594 mImagePreset = preset; 595 getImagePreset().setImageLoader(mImageLoader); 596 updateImagePresets(true); 597 if (addToHistory) { 598 mHistoryAdapter.addHistoryItem(getImagePreset()); 599 } 600 getImagePreset().setEndpoint(this); 601 updateImage(); 602 mImagePreset.fillImageStateAdapter(mImageStateAdapter); 603 invalidate(); 604 } 605 606 public void setImageLoader(ImageLoader loader) { 607 mImageLoader = loader; 608 if (mImageLoader != null) { 609 mImageLoader.addListener(this); 610 if (mImagePreset != null) { 611 mImagePreset.setImageLoader(mImageLoader); 612 } 613 } 614 } 615 616 private void setDirtyGeometryFlag() { 617 mDirtyGeometry = true; 618 } 619 620 protected void clearDirtyGeometryFlag() { 621 mDirtyGeometry = false; 622 } 623 624 protected boolean getDirtyGeometryFlag() { 625 return mDirtyGeometry; 626 } 627 628 private void imageSizeChanged(Bitmap image) { 629 if (image == null || getImagePreset() == null) 630 return; 631 float w = image.getWidth(); 632 float h = image.getHeight(); 633 GeometryMetadata geo = getImagePreset().mGeoData; 634 RectF pb = geo.getPhotoBounds(); 635 if (w == pb.width() && h == pb.height()) { 636 return; 637 } 638 RectF r = new RectF(0, 0, w, h); 639 getImagePreset().mGeoData.setPhotoBounds(r); 640 getImagePreset().mGeoData.setCropBounds(r); 641 setDirtyGeometryFlag(); 642 } 643 644 public boolean updateGeometryFlags() { 645 return true; 646 } 647 648 public void updateImage() { 649 if (!updateGeometryFlags()) { 650 return; 651 } 652 Bitmap bitmap = mImageLoader.getOriginalBitmapLarge(); 653 if (bitmap != null) { 654 imageSizeChanged(bitmap); 655 invalidate(); 656 } 657 } 658 659 public void imageLoaded() { 660 updateImage(); 661 invalidate(); 662 } 663 664 public void updateFilteredImage(Bitmap bitmap) { 665 mFilteredImage = bitmap; 666 } 667 668 public void saveImage(FilterShowActivity filterShowActivity, File file) { 669 mImageLoader.saveImage(getImagePreset(), filterShowActivity, file); 670 } 671 672 @Override 673 public boolean onTouchEvent(MotionEvent event) { 674 super.onTouchEvent(event); 675 if (USE_SLIDER_GESTURE) { 676 mSliderController.onTouchEvent(event); 677 } 678 if (mGestureDetector != null) { 679 mGestureDetector.onTouchEvent(event); 680 } 681 int ex = (int) event.getX(); 682 int ey = (int) event.getY(); 683 if (event.getAction() == MotionEvent.ACTION_DOWN) { 684 mTouchDownX = ex; 685 mTouchDownY = ey; 686 mTouchShowOriginalDate = System.currentTimeMillis(); 687 mShowOriginalDirection = 0; 688 } 689 if (event.getAction() == MotionEvent.ACTION_MOVE) { 690 mTouchX = ex; 691 mTouchY = ey; 692 if (!mActivity.isShowingHistoryPanel() 693 && (System.currentTimeMillis() - mTouchShowOriginalDate 694 > mTouchShowOriginalDelayMin)) { 695 mTouchShowOriginal = true; 696 } 697 } 698 if (event.getAction() == MotionEvent.ACTION_UP) { 699 mTouchShowOriginal = false; 700 mTouchDownX = 0; 701 mTouchDownY = 0; 702 mTouchX = 0; 703 mTouchY = 0; 704 } 705 invalidate(); 706 return true; 707 } 708 709 // listview stuff 710 711 public HistoryAdapter getHistory() { 712 return mHistoryAdapter; 713 } 714 715 public ArrayAdapter getImageStateAdapter() { 716 return mImageStateAdapter; 717 } 718 719 public void onItemClick(int position) { 720 setImagePreset(new ImagePreset(mHistoryAdapter.getItem(position)), false); 721 // we need a copy from the history 722 mHistoryAdapter.setCurrentPreset(position); 723 } 724 725 public void showOriginal(boolean show) { 726 mShowOriginal = show; 727 invalidate(); 728 } 729 730 public float getImageRotation() { 731 return getImagePreset().mGeoData.getRotation(); 732 } 733 734 public float getImageRotationZoomFactor() { 735 return getImagePreset().mGeoData.getScaleFactor(); 736 } 737 738 public void setImageRotation(float r) { 739 getImagePreset().mGeoData.setRotation(r); 740 } 741 742 public void setImageRotationZoomFactor(float f) { 743 getImagePreset().mGeoData.setScaleFactor(f); 744 } 745 746 public void setImageRotation(float imageRotation, 747 float imageRotationZoomFactor) { 748 float r = getImageRotation(); 749 if (imageRotation != r) { 750 invalidate(); 751 } 752 setImageRotation(imageRotation); 753 setImageRotationZoomFactor(imageRotationZoomFactor); 754 } 755 756 @Override 757 public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) { 758 int parameter = progress; 759 if (getCurrentFilter() != null) { 760 int maxp = getCurrentFilter().getMaxParameter(); 761 int minp = getCurrentFilter().getMinParameter(); 762 parameter = uiToParameter(progress, minp, maxp, arg0.getMax()); 763 } 764 765 onNewValue(parameter); 766 } 767 768 @Override 769 public void onStartTrackingTouch(SeekBar arg0) { 770 // TODO Auto-generated method stub 771 772 } 773 774 @Override 775 public void onStopTrackingTouch(SeekBar arg0) { 776 // TODO Auto-generated method stub 777 778 } 779 780 @Override 781 public boolean onDoubleTap(MotionEvent arg0) { 782 // TODO Auto-generated method stub 783 return false; 784 } 785 786 @Override 787 public boolean onDoubleTapEvent(MotionEvent arg0) { 788 // TODO Auto-generated method stub 789 return false; 790 } 791 792 @Override 793 public boolean onSingleTapConfirmed(MotionEvent arg0) { 794 // TODO Auto-generated method stub 795 return false; 796 } 797 798 @Override 799 public boolean onDown(MotionEvent arg0) { 800 // TODO Auto-generated method stub 801 return false; 802 } 803 804 @Override 805 public boolean onFling(MotionEvent startEvent, MotionEvent endEvent, float arg2, float arg3) { 806 if ((!mActivity.isShowingHistoryPanel() && startEvent.getX() > endEvent.getX()) 807 || (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())) { 808 if (!mTouchShowOriginal 809 || (mTouchShowOriginal && 810 (System.currentTimeMillis() - mTouchShowOriginalDate 811 < mTouchShowOriginalDelayMax))) { 812 mActivity.toggleHistoryPanel(); 813 } 814 } 815 return true; 816 } 817 818 @Override 819 public void onLongPress(MotionEvent arg0) { 820 // TODO Auto-generated method stub 821 822 } 823 824 @Override 825 public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { 826 // TODO Auto-generated method stub 827 return false; 828 } 829 830 @Override 831 public void onShowPress(MotionEvent arg0) { 832 // TODO Auto-generated method stub 833 834 } 835 836 @Override 837 public boolean onSingleTapUp(MotionEvent arg0) { 838 // TODO Auto-generated method stub 839 return false; 840 } 841 842} 843