user-interface - CAknView 容器内的 CAknSlider 控件(不作为设置项)

标签 user-interface symbian implementation

我对原生 Symbian 组件的实现效果感到惊讶。其中之一是 CAknSlider。 CAknSlider 是一个具有 slider 的控件,用户可以使用 slider 沿着方向可以是垂直或水平的条滑动。

现在滑动 slider 时,滑动非常平滑,不会闪烁。但如果由于某种原因我要实现一个自定义 slider 控件,我不会像 CAknSlider 那样整洁。

所以我的问题是如何弄清楚 CAknSlider 的底层是如何实现的。我想为我的 radio 应用程序实现一个自定义 slider 来控制音频流的音量。

知道我该怎么做吗?


[编辑:回应laalto的评论]

CAknSlider 控件通常实现为 setting item in the settings screen .

我从未见过它在复合控件容器(如 CCoeControl 或 CAknView )中实现为组件控件。这是我到目前为止所尝试过的:

首先,我创建了一个描述 slider 控件的资源文件,如下所示:

RESOURCE SLIDER r_volume_slider
{
 layout=EAknCtSlider;
 minvalue=0;
 maxvalue=10;
 step=1;
 valuetype=EAknSliderValuePercentage;
 minlabel="mute";
 maxlabel="full";
}

然后我使用源中的资源文件来创建 slider ,如下所示:

void CVolumePopupAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();

InitComponentArrayL( );
iSlider = new ( ELeave ) CAknSlider( );
TResourceReader reader;
iEikonEnv->CreateResourceReaderLC( reader, R_VOLUME_SLIDER );

iSlider->ConstructFromResourceL( reader );
CleanupStack::PopAndDestroy ( );
iSlider->SetContainerWindowL( *this );
iSlider->SetParent( this );

Components().AppendLC( iSlider );

CleanupStack::Pop ( iSlider );

// Set the windows size
SetRect(aRect);

// Activate the window, which makes it ready to be drawn
ActivateL();
}

这里是作为设置项的 CAknSlider ( Screenshot1 ) 和通过上述技术创建的 CAknSlider ( Screenshot2 ) 之间的比较。请注意,我创建的标签没有百分比值指示器以及最小和最大文本标签,即使我在资源中指定了它们。外观和感觉也很可怜。

最佳答案

有很多技术可以避免闪烁,从双缓冲整个屏幕到更简单的优化,例如仅重新绘制控件中实际发生变化的部分。预先绘制适当的矩形以位 block 传输 slider 所在的位置及其下一步可能是高效执行此操作的最简单方法。

要了解 CAknSlider 的具体操作方式,您可以: 1) 等待 Symbian Foundation 平台中的相关软件包开源 (EPL) - 应该在未来 12 个月内的某个时候,或者 2) 加入Symbian基金会并立即访问源代码

编辑:(响应有关图形优化的更多详细信息的请求)

最常见的闪烁是由重新绘制整个控件引起的。我已经(通过移植项目)实现了一些不会在这里闪烁的自定义控件:http://developer.symbian.com/main/documentation/porting/#linux2 甚至还有一些有点像 slider 的东西。这个例子远非理想,它没有预先绘制的用于位 block 传输的矩形,但图形是非常简单的线条和填充矩形。不过,仅覆盖更改的部分的概念是相同的。 blit 预绘制的部分。将 slider 的背景绘制到屏幕外位图,并对 slider 的可移动部分执行相同的操作。当 slider 移动时,通过从离屏背景(仅需要删除的部分)执行 BitBlt() 来删除可移动部分,然后将可移动部分 BitBlt() 移动到新位置。

这有意义吗?

关于user-interface - CAknView 容器内的 CAknSlider 控件(不作为设置项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/924517/

相关文章:

c# - 使用不同显示技术在两个 View 中显示数据的 MVVM 的正确实现

c - C头文件的实现?

java - Android 应用程序中的菜单操作和总和

python - 安装 PythonForS60 时出现证书错误

qt - 如何在QT中自定义ListView

c - C 中最快的 fgets 实现

java - Swing - 如何混合使用 JTextField 和 JTextAreas 并具有相同的视觉外观?

c# - 是否可以在不添加状态栏的情况下在表单上提供调整大小指示(resizer-grip)?

ios - 更新用户界面 Swift

Qt for Symbian - 检测触摸/非触摸设备