xamarinのボタン長押しイベントの作成方法
Visual Studio2015+xamarinで、Androidアプリを制作しています。
・タップ時にカウントを1増やす
・長押し時、ボタンに触れた段階でカウントを1増やす 1秒間、間を置いてタップしている間カウントを0.1秒ずつ1増やす
・長押し時、指を離すと止まる
というボタンを作成しようとしていますが、条件の2つめと3つめの処理をどのように作成すべきかわからず困っています。
現在、LongClickを使用し、長押しの状態を認識させていますが、
長押しした後にカウントが1増えるだけの状態です。
今回作成しようとしているボタンを作るにはどのように改善していけばよいでしょうか?
コードは以下の通りです
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace test
{
[Activity(Label = "test", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : BaseActivity
{
protected override int LayoutResource
{
get { return Resource.Layout.main; }
}
int count = 1;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Get our button from the layout resource,
// and attach an event to it
var clickButton = FindViewById<Button>(Resource.Id.my_button);
clickButton.Click += (sender, args) =>
{
clickButton.Text = string.Format("{0} clicks!", count++);
};
clickButton.LongClick += (sender, args) =>
{
clickButton.Text = string.Format("{0} clicks!", count++);
};
var navigationButton = FindViewById<Button>(Resource.Id.nav_button);
navigationButton.Click += (sender, args) =>
{
var intent = new Intent(this, typeof(SecondActivity));
intent.PutExtra("clicks", count);
StartActivity(intent);
};
SupportActionBar.SetDisplayHomeAsUpEnabled(false);
SupportActionBar.SetHomeButtonEnabled(false);
}
}
}
追記
ありがとうございます。
だいぶ期間が空いてしまいましたが、教えていただいたページと流れを参考にontouchを使用して動作させています。
現在、作成したコード内容は以下の通りです。
while文を使用し、ボタンが押しっぱなしになっている時にカウントアップし、ボタンから離すと止まるようにしたいのですが、ボタンから手を離してもMotionEventActions.Downの状態が認識され続けて無限ループが発生してしまいます。
どのようにすればループから抜け出すことができますか?
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Views;
using System.Diagnostics;
namespace test2
{
[Activity(Label = "test2", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity, View.IOnTouchListener
{
Stopwatch stopwatch = new Stopwatch();
int count = 1;
private Button button;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
button = FindViewById<Button>(Resource.Id.myButton);
button.SetOnTouchListener(this);
}
public bool OnTouch(View v, MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
stopwatch.Start();
button.Text = string.Format("{0} clicks!", count++);
break;
case MotionEventActions.Up:
Toast.MakeText(this, "up", ToastLength.Long).Show();
stopwatch.Stop();
stopwatch.Reset();
break;
}
Toast.MakeText(this, "root", ToastLength.Long).Show();
while (e.Action == MotionEventActions.Down)
{
if (stopwatch.ElapsedMilliseconds > 1000)
{
if (stopwatch.ElapsedMilliseconds % 100 == 0)
{
button.Text = string.Format("{0} clicks!", count++);
}
}
}
return true;
}
}
}