0

Tizen でのマルチタッチの例を理解しようとしています。次の部分に問題があります (このメソッドは、キャンバス上で指を 1 ピクセル以上動かすたびに呼び出されます):

result
MainForm::OnDraw(void)
{
    __pCanvas->Show();
    __pCanvas->
   Canvas* pCanvas = GetCanvasN();

   if (pCanvas)
   {
      pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),
                    *__pCanvas, GetClientAreaBounds());
      delete pCanvas;
   }
   // Do not call Show(); it is called automatically after OnDraw() callback

   return E_SUCCESS;
}

タッチ方法の例を次に示します。

void
MainForm::OnTouchMoved(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo)
{
    __pointCount++;
    __strokes[__strokeCount].push_back(currentPosition);
    DrawLine(__prevPosition, currentPosition, Color::GetColor(COLOR_ID_BLACK));
    Tizen::Base::String string;
    string.Append("...");
    string.Append((int)__pointCount);
    __pCanvas->DrawText(Point(50, 300), string);
    __prevPosition = currentPosition;
    Invalidate(false);
    AppLog("OnTouchMoved");
}

そして私の drawLine() メソッド:

void
MainForm::DrawLine(const Tizen::Graphics::Point& prevPoint, const Tizen::Graphics::Point& point, const Tizen::Graphics::Color& color)
{
    if (__pCanvas)
    {
        __pCanvas->DrawLine(prevPoint, point);
    }
}

ここで新しいキャンバスが作成される理由がわかりません(古いキャンバスが新しいキャンバスにコピーされる理由)。drawLine() を呼び出した後に古いキャンバスが更新されないのはなぜですか? どうにかして古いキャンバスを更新することはできませんか?

アップデート:

いくつかの編集の後、なんとか2つのキャンバスを作成できました。__pCanvas 境界でのみ描画できるようにしたいのですが、現在は「青」であり、「赤」に設定するのに問題があります。

ここに画像の説明を入力

これが私のコードです:

result
MainForm::OnInitializing(void)
{
    (...)
    AddTouchEventListener(*this);
    SetMultipointTouchEnabled(false);
    //SetMultipointTouchEnabled(true);

    __pCanvas = new (std::nothrow) Canvas();
    Rectangle rect = Rectangle(GetBounds().x, GetBounds().y, GetBounds().width, GetBounds().height);
    result r = __pCanvas->Construct(rect);

    __pInformationCanvas = new (std::nothrow) Canvas();
    r = __pInformationCanvas->Construct(Rectangle(0, 0, GetBounds().width, verticalDivider));
    if (r == E_SUCCESS)
    {
        __pCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_WHITE));
        __pCanvas->Clear();

        __pInformationCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_BLACK));
        __pInformationCanvas->Clear();

        Font font;
        font.Construct(FONT_STYLE_PLAIN, FONT_SIZE);
        __pCanvas->SetFont(font);

        Invalidate(false);
    }

    return E_SUCCESS;
}

そして onDraw メソッド:

result
MainForm::OnDraw(void)
{
    Canvas* pCanvas = GetCanvasN();
    if (pCanvas != null)
    {
        pCanvas->Clear();
        pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),
                      *__pCanvas,
                      GetClientAreaBounds());

        // Copy the second Canvas to the center of the Form's Canvas
        pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),
                      *__pInformationCanvas,
                      __pInformationCanvas->GetBounds());

        delete pCanvas;
    }

    // Do not call Show(). It will be called automatically after OnDraw() callback.
    return E_SUCCESS;
}
4

1 に答える 1

1

必要に応じて、フォームのキャンバスに直接描画できます。ステートメントOnDrawを除く のすべてを削除し、とからの呼び出しを削除して、これに置き換えてみてください。returnInvalidateOnTouchPressedOnTouchMovedMainForm::DrawCircle

void
MainForm::DrawCircle(const Tizen::Graphics::Point& point, const Tizen::Graphics::Color& color)
{
    Canvas* pCanvas = GetCanvasN();
    if (pCanvas)
    {
        Rectangle rcCircle(Point(point.x - ELLIPSE_RADIUS, point.y - ELLIPSE_RADIUS), Dimension(ELLIPSE_RADIUS * 2, ELLIPSE_RADIUS * 2));
        pCanvas->FillEllipse(color, rcCircle);

        delete pCanvas;
    }
}

サンプルアプリケーションで彼らが提案する方法は、Canvas描画する別のものを用意し、それをCanvasForm のCanvasin にコピーすることOnDrawです。同じ下層のサーフェスを記述するGetCanvasN新しいオブジェクトを作成するだけだと思いますが、間違っている可能性があります。Tizen のソース コードCanvasを自由に調べてください。

彼らがこの方法を提案する理由について。いくつかの理由が考えられます。たとえばForm、フォームが無効になると、フォームに描画したものはすべて失われますCanvas。1 回のコピー コマンドで描画したものを復元する方が、それまで実行したすべての描画コマンドを繰り返すよりもはるかに簡単です。
パフォーマンス上の理由も考えられます。つまり、OnDraw画面上のサーフェスを処理する場合、単一のコピー コマンドを実行する方が効率的です。
または、サンプルアプリを書いた人の個人的な好みかもしれません。


編集: 2 つのキャンバスを使用する例を次に示します。

Canvasで別の作成MainForm::OnInitializing:

__pCanvas = new (std::nothrow) Canvas();
result r = __pCanvas->Construct(GetBounds());
__pAnotherCanvas = new (std::nothrow) Canvas();
r = __pAnotherCanvas->Construct(Rectangle(0, 0, 100, 64));
if (r == E_SUCCESS)
{
    __pCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_WHITE));
    __pCanvas->Clear();
    __pAnotherCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_WHITE));
    __pAnotherCanvas->Clear();
    Invalidate(false);
}

OnDraw両方のキャンバスをフォームにコピーするように変更しCanvasます。

result
MainForm::OnDraw(void)
{
    Canvas* pCanvas = GetCanvasN();
    if (pCanvas != null)
    {
        pCanvas->Clear();
        pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),*__pCanvas, GetClientAreaBounds());

        // Copy the second Canvas to the center of the Form's Canvas
        int cx = GetClientAreaBounds().x + GetClientAreaBounds().width / 2;
        int cy = GetClientAreaBounds().y + GetClientAreaBounds().height / 2;
        pCanvas->Copy(Point(cx - __pAnotherCanvas->GetBounds().width / 2, cy - __pAnotherCanvas->GetBounds().height / 2),
                  *__pAnotherCanvas,
                  __pAnotherCanvas->GetBounds());


         delete pCanvas;
    }
    // Do not call Show(). It will be called automatically after OnDraw() callback.
    return E_SUCCESS;
}

CanvasたとえばOnTouchDoublePressed、_

void MainForm:: OnTouchDoublePressed(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo)
{
    Point point(0, 0);
    String str; str.Format(10, L"x = %d", currentPosition.x);
    __pAnotherCanvas->Clear();
    __pAnotherCanvas->DrawText(point, str, str.GetLength());
    Invalidate(false);
} 

フォームのクライアント領域のどこかをダブルクリックするたびにCanvas、Doodle の上に表示される秒を使用して、フォームの中心でクリックした場所の x 座標が印刷されます。

于 2013-06-27T12:13:48.813 に答える