質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

6858閲覧

WPFをつかってiPhoneやAndroidのようなスクロールを実現したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2015/12/01 02:48

編集2022/01/12 10:55

WPFをつかってiPhoneやAndroidのようなスクロールを実現したいです。
タップで加速度がついて、次第に減速して止まるようなやつです。

いま、こんな感じで、オブジェクトを移動はできるようになりました。
が、開始時のstartpointと、終了時のendpointに同じ値が入ってしまって、距離をとれずにいます。
アドバイスお願いします。

xmal

<Window x:Class="swipe.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="525">

<Canvas Name="canvas"> <Image Name ="image" Source="C:\01.jpg" Stretch="None" MouseLeftButtonDown="image_MouseLeftButtonDown" MouseLeftButtonUp="image_MouseLeftButtonUp" MouseMove="image_MouseMove" />
</Canvas> </Window>

C#

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace swipe {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private bool isDrag = false;
private Point dragOffset;
private Point startpoint;
private Point endpoint;
//加速度を処理するときは移動量の他に移動時間も取る。
TimeSpan 移動時間;
DateTime 移動開始時刻;
DateTime 移動終了時刻;
double 速度 = 0;
double 距離 = 0;
//慣性移動量の計算をする。

/// <summary> /// ドラッグ開始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { 移動開始時刻 = DateTime.Now; UIElement element = sender as UIElement; if (element != null) { isDrag = true; startpoint = dragOffset = e.GetPosition(element); element.CaptureMouse(); } } /// <summary> /// ドラッグ終了 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (isDrag) { UIElement element = sender as UIElement; element.ReleaseMouseCapture(); endpoint = e.GetPosition(element); 移動終了時刻 = DateTime.Now; 移動時間 = 移動終了時刻 - 移動開始時刻; double 移動時間の小数点以下 = double.Parse(移動時間.ToString("fffffff")); double X = startpoint.X - endpoint.X;//ここらへん。 double Y = startpoint.Y - endpoint.Y; double 縦横2乗 = Math.Pow(X, 2) + Math.Pow(Y, 2); 距離 = Math.Sqrt(縦横2乗); Title = "X=" + X + " Y=" + Y + " " +縦横2乗+ " " + 距離 + "/" + 移動時間の小数点以下 + "(pixcel/10000000second)"; isDrag = false; } } /// <summary> /// ドラック中 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void image_MouseMove(object sender, MouseEventArgs e) { if (isDrag) { Point point = Mouse.GetPosition(canvas); UIElement element = sender as UIElement; Canvas.SetLeft(element, point.X - dragOffset.X); Canvas.SetTop(element, point.Y - dragOffset.Y); } } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんばんは。

開始時のstartpointと、終了時のendpointに同じ値が入ってしまって、距離をとれずにいます。

startpointとendpointには、Imageオブジェクトから見たマウスの相対位置が入っているようです。

これをキャンバスから見た相対位置となるように変更してみてください。

C#

1startpoint = e.GetPosition(canvas); 2endpoint = e.GetPosition(canvas);

以上です。

投稿2015/12/01 08:03

daichan

総合スコア225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/01 08:16

ありがとうございます。 速度 = 距離 / 移動時間の小数点以下; 加速度 = 速度 / 移動時間の小数点以下; //Title = "X=" + X + " Y=" + Y + " " + 縦横2乗 + " " + 距離 + "/" + 移動時間の小数点以下 + "(pixcel/10000000second) + 速度=" + 速度 + " 加速度=" + 加速度; Title = "X=" + X + " Y=" + Y + " " + 距離 + "/" + 移動時間の小数点以下 + "(pixcel/10000000second) + 速度=" + 速度 + " 加速度=" + 加速度; として、加速度までとれました。 (加速度の桁がoverflowしてますが。。。) それで、あとは慣性をつけるのですが、具体的な計算は、どうなりますでしょう。 考え方としては、 1 質量を設定する。 2 摩擦を設定する。 ??? なのかなとは思います。 計算式と単位がぴんと来てないです。
退会済みユーザー

退会済みユーザー

2015/12/01 08:36

//http://www.10106.net/~hoboaki/curling.htm を参考に速度を引数として渡す摩擦methodを作りました。 private void 摩擦(double 初速度) { //ストーンとシート間の摩擦を加速度として考える。 //<変数定義> //v0:投球者がストーンを離す瞬間の速度,初速度 //t:ストーンを離してからの時間(秒) tは1秒とする。1秒後に速度は0になる。 //a:加速度 = シート間の摩擦 //t秒後の位置x(t)は //x(t) = v0 * t + 0.5 * a * t^2 //t秒後の速度v(t)は //v(t) = v0 + a * t for (int milliseconds = 0; milliseconds < 1000; milliseconds++) { //milliseconds秒後の位置x(milliseconds)は //x(milliseconds) = 初速度 * milliseconds + 0.5 * a * milliseconds^2 //このx(y)をobjectのPointに入れればよいはず。 //t秒後の速度v(milliseconds)は //v(milliseconds) = 初速度 + a * milliseconds } } みたいな感じなのかなと思います。 添削プリーズです。
daichan

2015/12/01 09:30

計算式については詳しくないのでコメントできませんが、 for文の使用は適切ではないと思います。 1ループ1msecで動くとは限らないからです。
daichan

2015/12/01 09:52

ScrollViewer.PanningDecelerationプロパティを使うのが一般的でしょうか。
退会済みユーザー

退会済みユーザー

2015/12/02 00:18

ーーーーーー昨日。2015/12/01ーーーーーー 最初。途方に暮れていた。 第1アイデア。mouse_move/touchで移動。 終わると止まる。摩擦や加速度が必要。 第2アイデア。物理法則を実装すればよい。 物理、むずかしい。 ーーーーーー今日。2015/12/02ーーーーーー 第3アイデア。物理はさておき、指をリリースしたときの速度、加速度、時間、方向はわかっているから、それをたとえば2倍にして実装すればどうか。 あれ。UIのなかでforを使うと描画が停止する予感。 UIを止めないためにはTimerか。 あれ。WPFにはTimerないな。あ。animationを使えばいいか。 第4アイデア。速度、加速度、時間、方向をanimationに渡せばどうだろう。これならanimationの条件を満たす気がする。ふむ。これ、今日の方針かな。 コメントありがとうございます。 ScrollViewer.PanningDecelerationプロパティというのがあるんですね。 わたしもforは、別の理由でNGかなと思いました。 ScrollViewerは使っていないので、animationでやってみよーと思ってます。
daichan

2015/12/02 00:27

> animationでやってみよーと思ってます。 がんばってください。 ちなみに、WPFにもTimerはあります。
退会済みユーザー

退会済みユーザー

2015/12/03 00:20

ありがとうございます。 1日やって頭が煮えてしまい、デモしたところ「いらない、ドラッグだけでいいから」と非情な評価を下され、摩擦アニメーションは断念しました。 いつかリベンジです。 えーWPFにもTimerがあるんですか。 知りませんでした。 ありがとうございます。
daichan

2015/12/03 00:29

> 1日やって頭が煮えてしまい、デモしたところ「いらない、ドラッグだけでいいから」と非情な評価を下され、摩擦アニメーションは断念しました。 あららwご苦労様でした。
退会済みユーザー

退会済みユーザー

2015/12/08 08:53

いえいえ。 いろいろ試して勉強になりました。 次回はもうすこしなんとかなるかも。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問