提交 dd7252c3 编写于 作者: Y YueBiang

add new style for slider

上级 fc0dc4ae
......@@ -23,6 +23,7 @@
#include "themes/theme_manager.h"
namespace OHOS {
#if SLIDER_KNOB
UISlider::UISlider()
: knobWidth_(0), knobWidthSetFlag_(false), knobStyleAllocFlag_(false), knobImage_(nullptr), listener_(nullptr)
{
......@@ -90,6 +91,265 @@ int64_t UISlider::GetKnobStyle(uint8_t key) const
return knobStyle_->GetStyle(key);
}
int16_t UISlider::GetKnobWidth()
{
if (!knobWidthSetFlag_) {
if ((direction_ == Direction::DIR_LEFT_TO_RIGHT) || (direction_ == Direction::DIR_RIGHT_TO_LEFT)) {
knobWidth_ = progressHeight_;
} else {
knobWidth_ = progressWidth_;
}
}
return knobWidth_;
}
void UISlider::SetImage(const ImageInfo* backgroundImage, const ImageInfo* foregroundImage, const ImageInfo* knobImage)
{
if (!InitImage()) {
return;
}
backgroundImage_->SetSrc(backgroundImage);
foregroundImage_->SetSrc(foregroundImage);
knobImage_->SetSrc(knobImage);
}
void UISlider::SetImage(const char* backgroundImage, const char* foregroundImage, const char* knobImage)
{
if (!InitImage()) {
return;
}
backgroundImage_->SetSrc(backgroundImage);
foregroundImage_->SetSrc(foregroundImage);
knobImage_->SetSrc(knobImage);
}
void UISlider::DrawKnob(const Rect& invalidatedArea, const Rect& foregroundRect)
{
int16_t halfKnobWidth = GetKnobWidth() >> 1;
int16_t offset;
Rect knobBar;
switch (direction_) {
case Direction::DIR_LEFT_TO_RIGHT: {
offset = (knobWidth_ - progressHeight_) >> 1;
knobBar.SetRect(foregroundRect.GetRight() - halfKnobWidth, foregroundRect.GetTop() - offset,
foregroundRect.GetRight() + halfKnobWidth, foregroundRect.GetBottom() + offset);
break;
}
case Direction::DIR_RIGHT_TO_LEFT: {
offset = (knobWidth_ - progressHeight_) >> 1;
knobBar.SetRect(foregroundRect.GetLeft() - halfKnobWidth, foregroundRect.GetTop() - offset,
foregroundRect.GetLeft() + halfKnobWidth, foregroundRect.GetBottom() + offset);
break;
}
case Direction::DIR_BOTTOM_TO_TOP: {
offset = (knobWidth_ - progressWidth_) >> 1;
knobBar.SetRect(foregroundRect.GetLeft() - offset, foregroundRect.GetTop() - halfKnobWidth,
foregroundRect.GetRight() + offset, foregroundRect.GetTop() + halfKnobWidth);
break;
}
case Direction::DIR_TOP_TO_BOTTOM: {
offset = (knobWidth_ - progressWidth_) >> 1;
knobBar.SetRect(foregroundRect.GetLeft() - offset, foregroundRect.GetBottom() - halfKnobWidth,
foregroundRect.GetRight() + offset, foregroundRect.GetBottom() + halfKnobWidth);
break;
}
default: {
GRAPHIC_LOGW("UISlider::DrawKnob Direction error!\n");
}
}
DrawValidRect(knobImage_, knobBar, invalidatedArea, *knobStyle_, 0);
}
bool UISlider::InitImage()
{
if (!UIAbstractProgress::InitImage()) {
return false;
}
if (knobImage_ == nullptr) {
knobImage_ = new Image();
if (knobImage_ == nullptr) {
GRAPHIC_LOGE("new Image fail");
return false;
}
}
return true;
}
#else
UISlider::UISlider()
: listener_(nullptr), turnUpImage_(nullptr), turnDownImage_(nullptr)
{
touchable_ = true;
draggable_ = true;
dragParentInstead_ = false;
#if ENABLE_FOCUS_MANAGER
focusable_ = true;
#endif
}
UISlider::~UISlider()
{
if (turnUpImage_ != nullptr) {
delete turnUpImage_;
turnUpImage_ = nullptr;
}
if (turnDownImage_ != nullptr) {
delete turnDownImage_;
turnDownImage_ = nullptr;
}
}
void UISlider::SetImage(const ImageInfo* backgroundImage, const ImageInfo* foregroundImage)
{
if (!InitImage()) {
return;
}
backgroundImage_->SetSrc(backgroundImage);
foregroundImage_->SetSrc(foregroundImage);
}
void UISlider::SetImage(const char* backgroundImage, const char* foregroundImage)
{
if (!InitImage()) {
return;
}
backgroundImage_->SetSrc(backgroundImage);
foregroundImage_->SetSrc(foregroundImage);
}
void UISlider::SetTurnImage(const ImageInfo* turnUpImage, const ImageInfo* turnDownImage)
{
if (!InitImage()) {
return;
}
turnUpImage_->SetSrc(turnUpImage);
turnDownImage_->SetSrc(turnDownImage);
}
void UISlider::SetTurnImage(const char* turnUpImage, const char* turnDownImage)
{
if (!InitImage()) {
return;
}
turnUpImage_->SetSrc(turnUpImage);
turnDownImage_->SetSrc(turnDownImage);
}
bool UISlider::InitImage()
{
if (!UIAbstractProgress::InitImage()) {
return false;
}
if (turnUpImage_ == nullptr) {
turnUpImage_ = new Image();
if (turnUpImage_ == nullptr) {
GRAPHIC_LOGE("new Image fail");
return false;
}
}
if (turnDownImage_ == nullptr) {
turnDownImage_ = new Image();
if (turnDownImage_ == nullptr) {
GRAPHIC_LOGE("new Image fail");
return false;
}
}
return true;
}
void UISlider::DrawTurnImage(const Rect& invalidatedArea)
{
}
void UISlider::DrawForeground(const Rect& invalidatedArea, Rect& coords)
{
Point startPoint;
int16_t progressWidth;
int16_t progressHeight;
uint16_t radius;
GetBackgroundParam(startPoint, progressHeight, progressHeight, radius, *foregroundStyle_);
int16_t left;
int16_t right;
int16_t top;
int16_t bottom;
Rect rect;
int16_t length;
switch (direction_) {
case Direction::DIR_LEFT_TO_RIGHT: {
length = GetCurrentPos(progressWidth - 1);
coords.SetRect(startPoint.x, startPoint.y, startPoint.x + progressWidth_ - 1, startPoint.y + progressHeight - 1);
left = startPoint.x - radius - 1;
right = left + length;
rect = Rect(left, startPoint.y, right, startPoint.y + progressHeight - 1);
break;
}
case Direction::DIR_RIGHT_TO_LEFT: {
length = GetCurrentPos(progressWidth - 1);
coords.SetRect(startPoint.x, startPoint.y, startPoint.x + progressWidth_ - 1, startPoint.y + progressHeight - 1);
right = startPoint.x + progressWidth + radius + 1;
left = right - length;
rect = Rect(left, startPoint.y, right, startPoint.y + progressHeight - 1);
break;
}
case Direction::DIR_TOP_TO_BOTTOM: {
length = GetCurrentPos(progressHeight - 1);
coords.SetRect(startPoint.x, startPoint.y, startPoint.x + progressWidth_ - 1, startPoint.y + progressHeight - 1);
top = startPoint.y - radius - 1;
bottom = top + length;
rect = Rect(startPoint.x, top, startPoint.x + progressWidth - 1, bottom);
break;
}
case Direction::DIR_BOTTOM_TO_TOP: {
length = GetCurrentPos(progressHeight - 1);
coords.SetRect(startPoint.x, startPoint.y, startPoint.x + progressWidth_ - 1, startPoint.y + progressHeight - 1);
bottom = startPoint.y + progressHeight - 1;
top = bottom - length;
rect = Rect(startPoint.x, top, startPoint.x + progressWidth - 1, bottom);
break;
}
default: {
GRAPHIC_LOGE("UIBoxProgress: DrawForeground direction Err!\n");
return;
}
}
if (rect.Intersect(rect, invalidatedArea)) {
DrawValidRect(foregroundImage_, coords, invalidatedArea, *foregroundStyle_, radius);
}
}
#endif
void UISlider::OnDraw(const Rect& invalidatedArea)
{
DrawRect::Draw(GetOrigRect(), invalidatedArea, *style_, opaScale_);
Rect trunc(invalidatedArea);
if (trunc.Intersect(trunc, GetOrigRect())) {
DrawBackground(trunc);
Rect foregroundRect;
DrawForeground(trunc, foregroundRect);
#if SLIDER_KNOB
DrawKnob(trunc, foregroundRect);
#else
if (turnUpImage_ != nullptr || turnDownImage_ != nullptr) {
DrawTurnImage(trunc);
}
#endif
}
}
int32_t UISlider::CalculateCurrentValue(int16_t length, int16_t totalLength)
{
if (totalLength != 0) {
......@@ -204,101 +464,4 @@ bool UISlider::OnRotateEvent(const RotateEvent& event)
return UIView::OnRotateEvent(event);
}
#endif
int16_t UISlider::GetKnobWidth()
{
if (!knobWidthSetFlag_) {
if ((direction_ == Direction::DIR_LEFT_TO_RIGHT) || (direction_ == Direction::DIR_RIGHT_TO_LEFT)) {
knobWidth_ = progressHeight_;
} else {
knobWidth_ = progressWidth_;
}
}
return knobWidth_;
}
void UISlider::SetImage(const ImageInfo* backgroundImage, const ImageInfo* foregroundImage, const ImageInfo* knobImage)
{
if (!InitImage()) {
return;
}
backgroundImage_->SetSrc(backgroundImage);
foregroundImage_->SetSrc(foregroundImage);
knobImage_->SetSrc(knobImage);
}
void UISlider::SetImage(const char* backgroundImage, const char* foregroundImage, const char* knobImage)
{
if (!InitImage()) {
return;
}
backgroundImage_->SetSrc(backgroundImage);
foregroundImage_->SetSrc(foregroundImage);
knobImage_->SetSrc(knobImage);
}
void UISlider::DrawKnob(const Rect& invalidatedArea, const Rect& foregroundRect)
{
int16_t halfKnobWidth = GetKnobWidth() >> 1;
int16_t offset;
Rect knobBar;
switch (direction_) {
case Direction::DIR_LEFT_TO_RIGHT: {
offset = (knobWidth_ - progressHeight_) >> 1;
knobBar.SetRect(foregroundRect.GetRight() - halfKnobWidth, foregroundRect.GetTop() - offset,
foregroundRect.GetRight() + halfKnobWidth, foregroundRect.GetBottom() + offset);
break;
}
case Direction::DIR_RIGHT_TO_LEFT: {
offset = (knobWidth_ - progressHeight_) >> 1;
knobBar.SetRect(foregroundRect.GetLeft() - halfKnobWidth, foregroundRect.GetTop() - offset,
foregroundRect.GetLeft() + halfKnobWidth, foregroundRect.GetBottom() + offset);
break;
}
case Direction::DIR_BOTTOM_TO_TOP: {
offset = (knobWidth_ - progressWidth_) >> 1;
knobBar.SetRect(foregroundRect.GetLeft() - offset, foregroundRect.GetTop() - halfKnobWidth,
foregroundRect.GetRight() + offset, foregroundRect.GetTop() + halfKnobWidth);
break;
}
case Direction::DIR_TOP_TO_BOTTOM: {
offset = (knobWidth_ - progressWidth_) >> 1;
knobBar.SetRect(foregroundRect.GetLeft() - offset, foregroundRect.GetBottom() - halfKnobWidth,
foregroundRect.GetRight() + offset, foregroundRect.GetBottom() + halfKnobWidth);
break;
}
default: {
GRAPHIC_LOGW("UISlider::DrawKnob Direction error!\n");
}
}
DrawValidRect(knobImage_, knobBar, invalidatedArea, *knobStyle_, 0);
}
void UISlider::OnDraw(const Rect& invalidatedArea)
{
DrawRect::Draw(GetOrigRect(), invalidatedArea, *style_, opaScale_);
Rect trunc(invalidatedArea);
if (trunc.Intersect(trunc, GetOrigRect())) {
DrawBackground(trunc);
Rect foregroundRect;
DrawForeground(trunc, foregroundRect);
DrawKnob(trunc, foregroundRect);
}
}
bool UISlider::InitImage()
{
if (!UIAbstractProgress::InitImage()) {
return false;
}
if (knobImage_ == nullptr) {
knobImage_ = new Image();
if (knobImage_ == nullptr) {
GRAPHIC_LOGE("new Image fail");
return false;
}
}
return true;
}
} // namespace OHOS
\ No newline at end of file
......@@ -78,6 +78,7 @@ public:
return UI_SLIDER;
}
#if SLIDER_KNOB
/**
* @brief Sets the width for this knob.
*
......@@ -106,32 +107,6 @@ public:
*/
int16_t GetKnobWidth();
#if ENABLE_ROTATE_INPUT
/**
* @brief 获得旋转系数
* @return 旋转系数
* @since 5.0
* @version 3.0
*/
int8_t GetRotateFactor()
{
return rotateFactor_;
}
/**
* @brief 设置旋转系数
* @param factor 旋转系数
* @since 5.0
* @version 3.0
*/
void SetRotateFactor(int8_t factor)
{
rotateFactor_ = factor;
}
bool OnRotateEvent(const RotateEvent& event) override;
#endif
/**
* @brief Sets the images as pixel maps for this slider, including the background, foreground, and knob images.
*
......@@ -224,7 +199,84 @@ public:
* @version 1.0
*/
int64_t GetKnobStyle(uint8_t key) const;
#else
/**
* @brief Sets the images as pixel maps for this slider, including the background, foreground, and knob images.
*
* @param backgroundImage Indicates the background image to set.
* @param foregroundImage Indicates the foreground image to set.
* @since 1.0
* @version 1.0
*/
void SetImage(const ImageInfo* backgroundImage, const ImageInfo* foregroundImage);
/**
* @brief Sets the images for this slider, including the background, foreground, and knob images.
*
* @param backgroundImage Indicates the background image to set.
* @param foregroundImage Indicates the foreground image to set.
* @since 1.0
* @version 1.0
*/
void SetImage(const char* backgroundImage, const char* foregroundImage);
/**
* @brief Sets the colors for this slider, including the background, foreground, and knob colors.
*
* @param backgroundColor Indicates the background color to set.
* @param foregroundColor Indicates the foreground color to set.
* @since 1.0
* @version 1.0
*/
void SetSliderColor(const ColorType backgroundColor, const ColorType foregroundColor)
{
SetBackgroundStyle(STYLE_BACKGROUND_COLOR, backgroundColor.full);
SetForegroundStyle(STYLE_BACKGROUND_COLOR, foregroundColor.full);
}
/**
* @brief Sets the corner radiuses for this slider, including the background, foreground, and knob corner radiuses.
*
* @param backgroundRadius Indicates the background corner radius to set.
* @param foregroundRadius Indicates the foreground corner radius to set.
* @since 1.0
* @version 1.0
*/
void SetSliderRadius(int16_t backgroundRadius, int16_t foregroundRadius)
{
SetBackgroundStyle(STYLE_BORDER_RADIUS, backgroundRadius);
SetForegroundStyle(STYLE_BORDER_RADIUS, foregroundRadius);
}
void SetTurnImage(const ImageInfo* turnUpImage, const ImageInfo* turnDownImage);
void SetTurnImage(const char* turnUpImage, const char* turnDownImage);
#endif
#if ENABLE_ROTATE_INPUT
/**
* @brief �����תϵ��
* @return ��תϵ��
* @since 5.0
* @version 3.0
*/
int8_t GetRotateFactor()
{
return rotateFactor_;
}
/**
* @brief ������תϵ��
* @param factor ��תϵ��
* @since 5.0
* @version 3.0
*/
void SetRotateFactor(int8_t factor)
{
rotateFactor_ = factor;
}
bool OnRotateEvent(const RotateEvent& event) override;
#endif
bool OnClickEvent(const ClickEvent& event) override;
bool OnDragEvent(const DragEvent& event) override;
......@@ -294,17 +346,24 @@ protected:
bool InitImage() override;
private:
#if SLIDER_KNOB
void DrawKnob(const Rect& invalidatedArea, const Rect& foregroundRect);
int32_t CalculateCurrentValue(int16_t length, int16_t totalLength);
int32_t UpdateCurrentValue(const Point& knobPosition);
#if ENABLE_ROTATE_INPUT
int8_t rotateFactor_ = 1;
#endif
int16_t knobWidth_;
bool knobWidthSetFlag_;
bool knobStyleAllocFlag_;
Style* knobStyle_;
Image* knobImage_;
#else
void DrawTurnImage(const Rect& invalidatedArea);
void DrawForeground(const Rect& invalidatedArea, Rect& coords);
Image* turnUpImage_;
Image* turnDownImage_;
#endif
int32_t CalculateCurrentValue(int16_t length, int16_t totalLength);
int32_t UpdateCurrentValue(const Point& knobPosition);
#if ENABLE_ROTATE_INPUT
int8_t rotateFactor_ = 1;
#endif
UISliderEventListener* listener_;
}; // class UISlider
} // namespace OHOS
......
......@@ -420,15 +420,15 @@ bool UITestSlider::OnClick(UIView& view, const ClickEvent& event)
slider_->SetDirection(UISlider::Direction::DIR_BOTTOM_TO_TOP);
slider_->SetValidHeight(g_height);
slider_->SetValidWidth(g_width);
slider_->SetKnobWidth(50); // 50: knob width
// slider_->SetKnobWidth(50); // 50: knob width
slider_->SetRange(g_max, g_min);
slider_->SetValue(g_progress);
slider_->SetStep(g_step);
slider_->SetBackgroundStyle(StyleDefault::GetProgressBackgroundStyle());
slider_->SetForegroundStyle(StyleDefault::GetProgressForegroundStyle());
slider_->SetKnobStyle(StyleDefault::GetSliderKnobStyle());
slider_->SetImage(static_cast<ImageInfo*>(nullptr), static_cast<ImageInfo*>(nullptr),
static_cast<ImageInfo*>(nullptr));
// slider_->SetKnobStyle(StyleDefault::GetSliderKnobStyle());
// slider_->SetImage(static_cast<ImageInfo*>(nullptr), static_cast<ImageInfo*>(nullptr),
// static_cast<ImageInfo*>(nullptr));
slider_->EnableBackground(true);
} else if (&view == incProgressBtn_) {
g_progress++;
......@@ -497,15 +497,15 @@ bool UITestSlider::ExpandClick2(UIView& view, const ClickEvent& event)
if (&view == imageBtn_) {
slider_->SetValidHeight(DEFAULT_HEIGHT);
slider_->SetValidWidth(5); // 5 valid width
slider_->SetKnobWidth(40); // 40: knob width
// slider_->SetKnobWidth(40); // 40: knob width
slider_->SetDirection(UISlider::Direction::DIR_BOTTOM_TO_TOP);
slider_->SetImage(SLIDER_BACKGROUND_IMAGE_PATH, SLIDER_INDICATOR_IMAGE_PATH, SLIDER_KNOB_IMAGE_PATH);
// slider_->SetImage(SLIDER_BACKGROUND_IMAGE_PATH, SLIDER_INDICATOR_IMAGE_PATH, SLIDER_KNOB_IMAGE_PATH);
} else if (&view == noImageBtn_) {
slider_->SetValidHeight(g_height);
slider_->SetValidWidth(g_width);
slider_->SetKnobWidth(g_knobWidth);
slider_->SetImage(static_cast<ImageInfo*>(nullptr), static_cast<ImageInfo*>(nullptr),
static_cast<ImageInfo*>(nullptr));
// slider_->SetKnobWidth(g_knobWidth);
// slider_->SetImage(static_cast<ImageInfo*>(nullptr), static_cast<ImageInfo*>(nullptr),
// static_cast<ImageInfo*>(nullptr));
} else if (&view == setStyleBtn_) {
Style style = StyleDefault::GetDefaultStyle();
style.bgColor_ = Color::White();
......@@ -513,21 +513,21 @@ bool UITestSlider::ExpandClick2(UIView& view, const ClickEvent& event)
style.bgColor_ = Color::Blue();
slider_->SetForegroundStyle(style);
style.bgColor_ = Color::Gray();
slider_->SetKnobStyle(style);
// slider_->SetKnobStyle(style);
} else if (&view == getStyleBtn_) {
slider_->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);
slider_->SetForegroundStyle(STYLE_BACKGROUND_COLOR, Color::Yellow().full);
slider_->SetKnobStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
// slider_->SetKnobStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
} else if (&view == incKnobWidthBtn_) {
g_knobWidth++;
slider_->SetKnobWidth(g_knobWidth);
// slider_->SetKnobWidth(g_knobWidth);
} else if (&view == decKnobWidthBtn_) {
g_knobWidth--;
slider_->SetKnobWidth(g_knobWidth);
// slider_->SetKnobWidth(g_knobWidth);
} else if (&view == colorBtn_) {
slider_->SetSliderColor(Color::Silver(), Color::Blue(), Color::White());
// slider_->SetSliderColor(Color::Silver(), Color::Blue(), Color::White());
} else if (&view == radiusBtn_) {
slider_->SetSliderRadius(DEFAULT_RADIUS, DEFAULT_RADIUS, DEFAULT_RADIUS);
// slider_->SetSliderRadius(DEFAULT_RADIUS, DEFAULT_RADIUS, DEFAULT_RADIUS);
} else if (&view == onChangeBtn_) {
g_onChange = true;
} else if (&view == onReleaseBtn_) {
......@@ -539,4 +539,4 @@ bool UITestSlider::ExpandClick2(UIView& view, const ClickEvent& event)
}
return true;
}
} // namespace OHOS
\ No newline at end of file
} // namespace OHOS
......@@ -236,15 +236,15 @@ void UITestDumpDomTree::UIKit_TestDumpDom_003()
slider->SetPosition(TEXT_DISTANCE_TO_LEFT_SIDE, VIEW_DISTANCE_TO_TOP_SIDE, 50, 100);
slider->SetValidHeight(250); // 250: valid height
slider->SetDirection(UISlider::Direction::DIR_BOTTOM_TO_TOP);
slider->SetKnobWidth(50); // 50: knob width
// slider->SetKnobWidth(50); // 50: knob width
slider->SetRange(100, 0); // 100: max
slider->SetValue(50); // 50: value of progress bar
slider->SetStep(0);
slider->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, Color::GetColorFromRGB(0, 182, 191).full); // 182, 191: color
slider->SetForegroundStyle(STYLE_BACKGROUND_COLOR, Color::GetColorFromRGB(255, 152, 0).full); // 255, 152: color
slider->SetKnobStyle(StyleDefault::GetSliderKnobStyle());
slider->SetImage(static_cast<ImageInfo*>(nullptr), static_cast<ImageInfo*>(nullptr),
static_cast<ImageInfo*>(nullptr));
// slider->SetKnobStyle(StyleDefault::GetSliderKnobStyle());
// slider->SetImage(static_cast<ImageInfo*>(nullptr), static_cast<ImageInfo*>(nullptr),
// static_cast<ImageInfo*>(nullptr));
slider->EnableBackground(true);
slider->SetViewId("dump_slider");
group5->Add(slider);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册