我对原生 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/