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..0ce7a2ca188e6c319bf1060952c59b16b415c023 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,24 @@ 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 U8CPU kHighlightColorAlpha = 0x4D; |
sadrul
2016/09/30 02:53:36
I don't see U8CPU type used anywhere else in chrom
yiyix
2016/10/03 16:06:50
Done.
|
// The thickness of the slider. |
const int kLineThickness = 2; |
-// The radius of the thumb of the slider. |
-const int kThumbRadius = 6; |
+// The radius of the thumb and the highlighted thumb of the slider, |
+// respectively. |
+const float kThumbRadius = 6.f; |
+const float kThumbHighlightRadius = 10.f; |
// The stroke of the thumb when the slider is disabled. |
const int kThumbStroke = 2; |
+// Duration of the thumb highlight growing effect animation. |
+const int kSlideHighlightChangeDurationMs = 150; |
+ |
MdSlider::MdSlider(SliderListener* listener) |
- : Slider(listener), is_active_(true) { |
+ : Slider(listener), is_active_(true), thumb_highlight_radius_(0.f) { |
SchedulePaint(); |
} |
@@ -37,21 +44,33 @@ void MdSlider::OnPaint(gfx::Canvas* canvas) { |
Slider::OnPaint(canvas); |
// Paint the slider. |
- const int thumb_size = kThumbRadius * 2; |
const gfx::Rect content = GetContentsBounds(); |
- const int width = content.width() - thumb_size; |
+ const int width = content.width() - kThumbRadius * 2; |
const int full = GetAnimatingValue() * width; |
const int empty = width - full; |
const int y = content.height() / 2 - kLineThickness / 2; |
+ const int x = content.x() + full + kThumbRadius; |
+ const SkColor current_thumb_color = |
+ is_active_ ? kActiveColor : kDisabledColor; |
canvas->FillRect(gfx::Rect(content.x(), y, full, kLineThickness), |
- is_active_ ? kActiveColor : kDisabledColor); |
- canvas->FillRect( |
- gfx::Rect(content.x() + full + thumb_size, y, empty, kLineThickness), |
- kDisabledColor); |
+ current_thumb_color); |
+ canvas->FillRect(gfx::Rect(x + kThumbRadius, y, empty, kLineThickness), |
+ kDisabledColor); |
+ |
+ gfx::Point thumb_center(x, content.height() / 2); |
+ |
+ // Paint the thumb highlight if it exists. |
+ if (is_active_ && thumb_highlight_radius_ > kThumbRadius) { |
+ SkPaint highlight; |
+ SkColor kHighlightColor = SkColorSetA(kActiveColor, kHighlightColorAlpha); |
+ highlight.setColor(kHighlightColor); |
+ highlight.setFlags(SkPaint::kAntiAlias_Flag); |
+ canvas->DrawCircle(thumb_center, thumb_highlight_radius_, highlight); |
+ } |
// Paint the thumb of the slider. |
SkPaint paint; |
- paint.setColor(is_active_ ? kActiveColor : kDisabledColor); |
+ paint.setColor(current_thumb_color); |
paint.setFlags(SkPaint::kAntiAlias_Flag); |
if (!is_active_) { |
@@ -59,7 +78,7 @@ void MdSlider::OnPaint(gfx::Canvas* canvas) { |
paint.setStyle(SkPaint::kStroke_Style); |
} |
canvas->DrawCircle( |
- gfx::Point(content.x() + full + kThumbRadius, content.height() / 2), |
+ thumb_center, |
is_active_ ? kThumbRadius : (kThumbRadius - kThumbStroke / 2), paint); |
} |
@@ -75,4 +94,34 @@ void MdSlider::UpdateState(bool control_on) { |
int MdSlider::GetThumbWidth() { |
return kThumbRadius * 2; |
} |
+ |
+void MdSlider::SetHighlighted(bool is_highlighted) { |
+ if (!highlight_animation_) { |
+ highlight_animation_.reset(new gfx::SlideAnimation(this)); |
sadrul
2016/09/30 02:53:36
This can probably have an early return if (!is_hig
yiyix
2016/10/03 16:06:50
That's true. updated.
|
+ highlight_animation_->SetSlideDuration(kSlideHighlightChangeDurationMs); |
+ } |
+ if (is_highlighted) |
+ highlight_animation_->Show(); |
+ else |
+ highlight_animation_->Hide(); |
+} |
+ |
+void MdSlider::AnimationProgressed(const gfx::Animation* animation) { |
+ if (animation != highlight_animation_.get()) { |
+ Slider::AnimationProgressed(animation); |
+ return; |
+ } |
+ thumb_highlight_radius_ = |
+ animation->CurrentValueBetween(kThumbRadius, kThumbHighlightRadius); |
+ SchedulePaint(); |
+} |
+ |
+void MdSlider::AnimationEnded(const gfx::Animation* animation) { |
+ Slider::AnimationEnded(animation); |
sadrul
2016/09/30 02:53:36
In AnimationProgressed(), you call back into Slide
yiyix
2016/10/03 16:06:50
Done.
|
+ if (animation == highlight_animation_.get() && |
+ !highlight_animation_->IsShowing()) { |
+ highlight_animation_.reset(); |
+ } |
+} |
+ |
} // namespace views |