Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Unified Diff: ui/views/controls/md_slider.cc

Issue 2335513002: Adding ripple effect for clicks on MD slider (Closed)
Patch Set: adding animation Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/controls/md_slider.cc
diff --git a/ui/views/controls/md_slider.cc b/ui/views/controls/md_slider.cc
index 1a58eaec55cd9ec966c6a5ea67eb260224616532..da7270bc093ef0d73f55f581770497e5b874cce7 100644
--- a/ui/views/controls/md_slider.cc
+++ b/ui/views/controls/md_slider.cc
@@ -6,6 +6,7 @@
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkPaint.h"
+#include "ui/gfx/animation/slide_animation.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
@@ -16,18 +17,25 @@ namespace views {
// Color of slider at the active and the disabled state, respectively.
const SkColor kActiveColor = SkColorSetARGB(0xFF, 0x42, 0x85, 0xF4);
const SkColor kDisabledColor = SkColorSetARGB(0x42, 0x00, 0x00, 0x00);
+const SkColor kHighlightColor = SkColorSetARGB(0x4D, 0x42, 0x85, 0xF4);
// The thickness of the slider.
const int kLineThickness = 2;
// The radius of the thumb of the slider.
-const int kThumbRadius = 6;
+const float kThumbRadius = 6.0;
// The stroke of the thumb when the slider is disabled.
const int kThumbStroke = 2;
+// The radius and stroke of the thumb's ripple.
+const float kThumbHighlightStroke = 4.0;
+
+// Duration of the animation.
bruthig 2016/09/21 00:27:45 Be more specific here. i.e. What 'animation'?
yiyix 2016/09/21 15:20:52 Sorry, I was playing with slide animation and line
+const int kSlideValueChangeDurationMS = 150;
+
MdSlider::MdSlider(SliderListener* listener)
- : Slider(listener), is_active_(true) {
+ : Slider(listener), is_active_(true), animating_thumb_value_(0.f) {
SchedulePaint();
}
@@ -61,6 +69,22 @@ void MdSlider::OnPaint(gfx::Canvas* canvas) {
canvas->DrawCircle(
gfx::Point(content.x() + full + kThumbRadius, content.height() / 2),
is_active_ ? kThumbRadius : (kThumbRadius - kThumbStroke / 2), paint);
+
+ if (is_active_ && value_ > 0) {
bruthig 2016/09/21 00:27:46 Is it an intentional decision to paint the highlig
yiyix 2016/09/21 15:20:52 The highlight and the thumb are not over each othe
+ SkPaint highlight;
+ highlight.setColor(kHighlightColor);
+ highlight.setStyle(SkPaint::kStroke_Style);
+ highlight.setFlags(SkPaint::kAntiAlias_Flag);
+ float val =
bruthig 2016/09/21 00:27:45 Using |highlight_radius| variable name would be mo
yiyix 2016/09/21 15:20:52 Done.
+ highlight_animation_.get() && highlight_animation_->is_animating()
bruthig 2016/09/21 00:27:45 It would be less confusing if the painting of the
yiyix 2016/09/21 15:20:52 I don't really get it, the highlight is dependent
+ ? animating_thumb_value_
+ : kThumbHighlightStroke;
+
+ highlight.setStrokeWidth(val);
+ canvas->DrawCircle(
+ gfx::Point(content.x() + full + kThumbRadius, content.height() / 2),
bruthig 2016/09/21 00:27:45 Consider computing the thumb center point once and
yiyix 2016/09/21 15:20:52 good point.
+ (kThumbRadius + val / 2), highlight);
+ }
}
const char* MdSlider::GetClassName() const {
@@ -75,4 +99,24 @@ void MdSlider::UpdateState(bool control_on) {
int MdSlider::GetThumbWidth() {
return kThumbRadius * 2;
}
+
+void MdSlider::SetFocus(bool focus) {
+ if (focus) {
+ value_ = kThumbHighlightStroke;
+ animating_thumb_value_ = 0;
+ highlight_animation_.reset(new gfx::SlideAnimation(this));
+ highlight_animation_->SetSlideDuration(kSlideValueChangeDurationMS);
+ highlight_animation_->Show();
+ } else {
+ value_ = 0;
bruthig 2016/09/21 00:27:45 I think it would be more visually pleasing if the
yiyix 2016/09/21 15:20:52 The animation was not really specified in the desi
+ }
+ SchedulePaint();
+}
+
+void MdSlider::AnimationProgressed(const gfx::Animation* animation) {
+ Slider::AnimationProgressed(animation);
+ animating_thumb_value_ =
bruthig 2016/09/21 00:27:45 This should only update |animating_thumb_value_| i
yiyix 2016/09/21 15:20:52 Done.
+ animation->CurrentValueBetween(animating_thumb_value_, value_);
+}
+
} // namespace views

Powered by Google App Engine
This is Rietveld 408576698