가로 스크롤링 이미지를 만들고 싶습니다. "Blackberry Travel"앱을 본 경우이 앱의 상단 이미지는 동적으로 스크롤됩니다. 같은 스크롤보기를 만들고 싶습니다. 또한 이미지 하단에는 서클을 볼 수 있습니다. 이미지가 변하면 특정 원이 어둡게됩니다. 이 스크롤은 두 가지 방법으로 스크롤 할 수 있습니다. 마우스를 클릭하면 스크롤됩니다. 그래서, 그러한 스크롤을 만드는 것을 도와주세요. 나 여기 처음이야. 고맙습니다 ...가로 스크롤
가로 스크롤
답변
다음은 원/도트 선택 패러다임의 행을 제공하는 컨테이너를 기반으로하는 사용자 지정 컨트롤입니다. 데모 용으로 표준 부인이 적용됩니다. 모든 오류 조건 등을 포착하지는 않습니다. 기본적으로 컨테이너는 각 끝 부분에 많은 공간을 넣지 않으므로 색인 항목을 선택하는 계산은 약간 꺼져 있습니다. 그것은 항목 사이 않습니다. 나는 당신에게 할 일을 남겨 둬야 만합니다.)
또한 선택 및 선택 해제 양식에 대한 이미지를 제공해야하지만 어렵지 않습니다.
/*
* ScrollGadget.hpp
*
* Created on: May 22, 2014
* Author: richard
*/
#ifndef SCROLLGADGET_HPP_
#define SCROLLGADGET_HPP_
#include <QObject>
#include <bb/cascades/Container>
#include <bb/cascades/ImageView>
#include <bb/cascades/Layout>
#include <QUrl>
using namespace bb::cascades;
namespace net
{
namespace test
{
class ScrollGadget : public Container
{
Q_OBJECT
Q_PROPERTY(int selectedIndex READ selectedIndex WRITE setSelectedIndex NOTIFY selectedIndexChanged)
Q_PROPERTY(int itemCount READ itemCount WRITE setItemCount NOTIFY itemCountChanged)
public:
ScrollGadget(Container *parent = 0);
virtual ~ScrollGadget();
int selectedIndex() const;
int itemCount() const;
public slots:
void setSelectedIndex(int index);
void syncSelectedIndex(int index);
void setItemCount(int count);
private slots:
void onTouch(bb::cascades::TouchEvent*);
void handleLayoutFrameUpdated(QRectF);
signals:
void selectedIndexChanged(int selectedIndex);
void itemCountChanged(int count);
private:
int mSelectedIndex, mItemCount, mSaveIndex;
qreal mWidth, mHeight;
QUrl mSelected, mDeselected;
ImageView **mImageView;
};
} /* namespace test */
} /* namespace net */
#endif /* SCROLLGADGET_HPP_ */
그리고 C++ 소스 :
이/*
* ScrollGadget.cpp
*
* Created on: May 22, 2014
* Author: richard
*/
#include <QDebug>
#include <src/ScrollGadget.hpp>
#include <bb/cascades/TouchBehavior>
#include <bb/cascades/TouchType>
#include <bb/cascades/PropagationPhase>
#include <bb/cascades/TouchResponse>
#include <bb/cascades/StackLayout>
#include <bb/cascades/LayoutOrientation>
#include <bb/cascades/LayoutUpdateHandler>
using namespace bb::cascades;
namespace net
{
namespace test
{
ScrollGadget::ScrollGadget(Container *parent) : Container(parent),
mSelectedIndex(0),
mItemCount(0),
mSaveIndex(0),
mWidth(0),
mHeight(0),
mSelected("asset:///active.png"),
mDeselected("asset:///inactive.png"),
mImageView(NULL)
{
qDebug() << __PRETTY_FUNCTION__;
setLayout(StackLayout::create().orientation(LayoutOrientation::LeftToRight));
addTouchBehavior(
TouchBehavior::create()
.addTouchReaction(TouchType::Down,
PropagationPhase::AtTarget,
TouchResponse::StartTracking));
LayoutUpdateHandler::create(this)
.onLayoutFrameChanged(this, SLOT(handleLayoutFrameUpdated(QRectF)));
bool c = this->connect(this, SIGNAL(touch(bb::cascades::TouchEvent*)), this, SLOT(onTouch(bb::cascades::TouchEvent*)));
Q_ASSERT(c);
Q_UNUSED(c);
}
ScrollGadget::~ScrollGadget()
{
if (mImageView) {
delete mImageView;
}
}
int ScrollGadget::selectedIndex() const {
return mSelectedIndex;
}
int ScrollGadget::itemCount() const {
return mItemCount;
}
void ScrollGadget::setSelectedIndex(int index) {
if (index != mSelectedIndex && index >= 0 && index < mItemCount) {
syncSelectedIndex(index);
emit selectedIndexChanged(mSelectedIndex);
qDebug() << "selectedIndexChanged(" << mSelectedIndex << ")";
}
}
void ScrollGadget::syncSelectedIndex(int index) {
if (index != mSelectedIndex && index >= 0 && index < mItemCount) {
mImageView[mSelectedIndex]->setImageSource(mDeselected);
mSelectedIndex = index;
mImageView[mSelectedIndex]->setImageSource(mSelected);
}
}
void ScrollGadget::setItemCount(int count) {
qDebug() << __PRETTY_FUNCTION__;
if (count != mItemCount && count > 0) {
if (mItemCount > 0 && mImageView != NULL) {
for (int i = 0; i < mItemCount; i++) {
if (mImageView[i] != NULL) {
remove(mImageView[i]);
mImageView[i]->deleteLater();
}
}
}
mItemCount = count;
if (mSelectedIndex < 0 || mSelectedIndex >= mItemCount) {
mSelectedIndex = 0;
}
mImageView = new ImageView*[mItemCount];
for (int i = 0; i < mItemCount; i++) {
mImageView[i] = new ImageView(this);
if (i == mSelectedIndex) {
mImageView[i]->setImageSource(mSelected);
} else {
mImageView[i]->setImageSource(mDeselected);
}
add(mImageView[i]);
}
emit selectedIndexChanged(mSelectedIndex);
qDebug() << "selectedIndexChanged(" << mSelectedIndex << ")";
}
}
void ScrollGadget::onTouch(TouchEvent *event) {
//qDebug() << __PRETTY_FUNCTION__ << *event;
int index = event->localX()/(mWidth/mItemCount);
qDebug() << "index" << index;
if (index < 0) index = 0;
if (index >= mItemCount) index = mItemCount - 1;
switch (event->touchType()) {
case TouchType::Down:
mSaveIndex = mSelectedIndex;
setSelectedIndex(index);
break;
case TouchType::Move:
case TouchType::Up:
setSelectedIndex(index);
break;
case TouchType::Cancel:
setSelectedIndex(mSaveIndex);
break;
}
}
void ScrollGadget::handleLayoutFrameUpdated(QRectF rect) {
qDebug() << __PRETTY_FUNCTION__ << rect;
mWidth = rect.width();
mHeight = rect.height();
}
} /* namespace test */
} /* namespace net */
이 QML 파일이 빈 블랙 베리 프로젝트에서 그것을 보여줄 것입니다 :
import bb.cascades 1.2
import net.test 1.0
Page {
Container {
Label {
id: label
// Localized text with the dynamic translation and locale updates support
text: qsTr("Hello World ") + scroll.selectedIndex + Retranslate.onLocaleOrLanguageChanged
textStyle.base: SystemDefaults.TextStyles.BigText
}
ScrollGadget {
id: scroll
itemCount: 3
}
}
}
그러나 돈 여기
클래스 정의입니다 applicationui.cpp에서 QML 문서를로드하기 전에 ScrollGadget을 등록하는 것을 잊지 마십시오 :#include "ScrollGadget.hpp"
...
qmlRegisterType<ScrollGadget>("net.test", 1, 0, "ScrollGadget");
// Create scene document from main.qml asset, the parent is set
// to ensure the document gets destroyed properly at shut down.
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
...
여기에는 내가 사용한 활성 이미지와 비활성 이미지가 있습니다.
이 가젯을 사용하려면 selectedIndex를 목록과 같은 이미지 표시 객체에 연결하십시오. 목록의 selectedIndex와 같은 이미지 디스플레이의 선택 신호를 ScrollGadget의 syncSelectedIndex에 연결하여 목록의 변경 사항을 가젯에 반영 할 수 있습니다. 이 질문의 답을 아는 사람은
안녕하세요. Richard, 코드를 복사하여 붙여 넣기 만하면 출력이 "Hello World 0"이 아닙니다. 지금 무엇을해야할까요? – GoNish
"asset : ///active.png" "asset : ///inactive.png"에 대한 이미지가 있으면 해당 이미지가 세 개 표시됩니다. 첫 번째는 활성 상태이고 다른 두 개는 비활성 상태입니다. 그런 다음 해당 이미지를 클릭하여 3 중 어느 것이 활성인지 선택하거나 손가락을 앞뒤로 움직일 수 있어야합니다. – Richard
안녕하세요. Richard, 감사합니다. 내가 이해 한 코드를 이해하려고 노력 중이다.이제는 얼마나 많은 이미지가 스크롤에 포함되는지 알지 못한다고 가정 할 때 이미지가 3 개나 5 개일 수 있습니다. 실제로 서버의 이미지를 제공하여 활성 이미지와 비활성 이미지의 수가 변경되도록합니다. 아이디어 있어요? – GoNish
- 1. 가로 스크롤
- 2. 가로 스크롤 페이지의 가로 스크롤보기
- 3. 가로 스크롤 및 세로 스크롤
- 4. DIV 가로 스크롤 막대가 기본 가로 스크롤 막대가 됨
- 5. div의 가로 스크롤 막대
- 6. Android에서 가로 스크롤?
- 7. jQuery.ScrollTo/jQuery.SerialScroll 가로 스크롤
- 8. 가로 스크롤 winforms listview
- 9. IE6의 가로 스크롤 막대
- 10. ASP.NET [GridView를 가로 스크롤]
- 11. Macvim : 가로 스크롤 막대
- 12. UITextView 가로 스크롤
- 13. Jquery 아코디언 가로 스크롤?
- 14. CFGRID 가로 스크롤
- 15. 가로 스크롤 가능 TextView
- 16. CSS 가로 DIV 스크롤
- 17. 파노라마보기의 가로 스크롤
- 18. TinyScrollbar - 가로 자동 스크롤
- 19. MKMapView에서 무한 가로 스크롤
- 20. 앵커로 가로 스크롤
- 21. 가로 스크롤 CSS를 사용하여
- 22. 가로 스크롤 추가
- 23. html 가로 스크롤
- 24. jQuery/HTML - 가로 스크롤
- 25. CSS 가로 스크롤 상자
- 26. bash 창의 가로 스크롤
- 27. 가로 스크롤 짹짹
- 28. 자동 스크롤 가로 스크롤보기
- 29. android에서 가로 스크롤 문제
- 30. Yii CGridView 가로 스크롤
있습니까? – GoNish
나는 당신이 질문을 제기 한 이래로 이것을 생각 해왔다. 꽤 간단한 개념이지만 깨끗한 구현을 위해 몇 가지 신중한 계획을 세울 것입니다. 당신이 원하는 것은 두 가지 맞춤형 컨트롤이라고 생각합니다. 스 와이프 제스처로 이미지 스크롤을 처리하고 예상되는 모든 동작을 중심으로 스냅을 제공합니다. 두 번째 사용자 정의 컨트롤은 "도트"UI를 제공하고 터치 및 스 와이프 제스처를 허용합니다. 그런 다음이 두 컨트롤은 신호 및 슬롯과 통신합니다. 아마도 이미지를 제공하는 데이터 모델 객체 일 것입니다. 내가 함께 할 수있는 것을 볼 것이다. – Richard
Richard, xmldatamodel을 사용하여 ListView를 사용해 보았습니다.하지만 "점"과 적절한 작업을 만들 수 없습니다. – GoNish