using System;
using Android.Views;
using Android.Content;
using Android.Util;
using Android.Runtime;
namespace Shared
{
//已经全面检查了代码
///
/// 位置布局
///
public class HorizontalSeekBar : View
{
Android.Widget.ImageView backImageView;
Android.Widget.ImageView progressImageView;
Android.Widget.Button thumbButton;
AndroidHorizontalSeekBar androidHorizonetalSeekBar;
///
/// 当前实例
///
public HorizontalSeekBar()
{
AndroidView = new AndroidFrameLayout(Application.Activity, null) { };
//AndroidView.SetBackgroundColor (Android.Graphics.Color.DarkCyan);
{
backImageView = new Android.Widget.ImageView(Application.Activity, null) { Enabled=false };
backImageView.SetBackgroundColor(Android.Graphics.Color.WhiteSmoke);
(AndroidView as AndroidFrameLayout).AddView(backImageView, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Dip2Px(2), GravityFlags.CenterVertical));
}
progressImageView = new Android.Widget.ImageView(Application.Activity, null) { Enabled=false};
progressImageView.SetBackgroundColor(Android.Graphics.Color.Rgb(0xFE, 0x5E, 00));
(AndroidView as AndroidFrameLayout).AddView(progressImageView, new Android.Widget.FrameLayout.LayoutParams(0, Dip2Px(2), GravityFlags.CenterVertical));
thumbButton = new Android.Widget.Button(Application.Activity, null) { Background = new Android.Graphics.Drawables.GradientDrawable(),Enabled=false };
(AndroidView as AndroidFrameLayout).AddView(thumbButton, new Android.Widget.FrameLayout.LayoutParams(Dip2Px(ThumbRadius), Dip2Px(ThumbRadius), GravityFlags.CenterVertical));
androidHorizonetalSeekBar = new AndroidHorizontalSeekBar(Application.Activity, this);
(AndroidView as AndroidFrameLayout).AddView(androidHorizonetalSeekBar, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent));
}
uint progressColor = 0xFFEB642C;
///
/// 进度颜色
///
/// The color of the progress.
public uint ProgressColor
{
get
{
return progressColor;
}
set
{
progressColor = value;
int r = (byte)(progressColor / 256 / 256 % 256);
int g = (byte)(progressColor / 256 % 256);
int b = (byte)(progressColor % 256);
int a = (byte)(progressColor / 256 / 256 / 256 % 256);
progressImageView.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
}
}
public int SleepTime = 0;
uint backgroundColor = (uint)Android.Graphics.Color.WhiteSmoke.ToArgb();
///
/// 底部颜色
///
/// The color of the background.
public new uint BackgroundColor
{
get
{
return backgroundColor;
}
set
{
backgroundColor = value;
int r = (byte)(backgroundColor / 256 / 256 % 256);
int g = (byte)(backgroundColor / 256 % 256);
int b = (byte)(backgroundColor % 256);
int a = (byte)(backgroundColor / 256 / 256 / 256 % 256);
backImageView.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
}
}
///
/// 进度变化事件
///
public Action ProgressChanged;
///
/// 最大值
///
/// The max.
public int Max
{
get
{
return androidHorizonetalSeekBar.Max;
}
set
{
androidHorizonetalSeekBar.Max = value;
}
}
///
/// 是否允许滑动滑块
///
/// true if is can scrolled; otherwise, false.
public bool IsCanScrolled
{
get
{
return androidHorizonetalSeekBar.Enabled;
}
set
{
thumbButton.Visibility = value ? ViewStates.Visible : ViewStates.Gone;
androidHorizonetalSeekBar.Enabled = value;
}
}
//2019-08-29 改100毫秒
public int DelayTime = 100;
//防止跳动,延时显示状态
public DateTime delayDateTime = DateTime.MinValue;
///
/// 当前进度
///
/// The progress.
public int Progress
{
get
{
return androidHorizonetalSeekBar.Progress;
}
set
{
//发送命令后1000毫秒内不更新状态,防止跳动
if ((DateTime.Now - delayDateTime).TotalMilliseconds < DelayTime)
{
return;
}
androidHorizonetalSeekBar.Progress = value;
if (!IsCanRefresh)
{
return;
}
int width = (int)(androidHorizonetalSeekBar.Progress * 1.0 / androidHorizonetalSeekBar.Max * (Width - thumbButton.LayoutParameters.Width));
progressImageView.LayoutParameters.Width = width + thumbButton.LayoutParameters.Width / 2;
var layoutParameter = (thumbButton.LayoutParameters as Android.Widget.FrameLayout.LayoutParams);
layoutParameter.LeftMargin = width;
thumbButton.LayoutParameters = layoutParameter;
}
}
uint thumbColor = 0xFFFFFFFF;
///
/// 滑块颜色
///
/// The color of the background.
public uint ThumbColor
{
get
{
return thumbColor;
}
set
{
thumbColor = value;
int r = (byte)(thumbColor / 256 / 256 % 256);
int g = (byte)(thumbColor / 256 % 256);
int b = (byte)(thumbColor % 256);
int a = (byte)(thumbColor / 256 / 256 / 256 % 256);
((Android.Graphics.Drawables.GradientDrawable)thumbButton.Background).SetColor(Android.Graphics.Color.Argb(a, r, g, b));
}
}
public DateTime dateTime = DateTime.MinValue;
internal override bool TouchEvent(MotionEvent e)
{
if (!IsCanMove||!Enable)
{
return true;
}
delayDateTime = DateTime.Now;
switch (e.Action)
{
case MotionEventActions.Down:
dateTime = DateTime.MinValue;
break;
case MotionEventActions.Move:
if (dateTime == DateTime.MinValue)
{
dateTime = DateTime.Now;
}
setValue(e.GetX());
break;
case MotionEventActions.Up:
dateTime = DateTime.MinValue;
setValue(e.GetX());
break;
}
return base.TouchEvent(e);
}
int beforValue;
///
/// 是否可以滑动
///
public bool IsCanMove = true;
void setValue(float x)
{
if (x < 0)
{
x = 0;
}
if (Width - thumbButton.LayoutParameters.Width < x)
{
x = Width - thumbButton.LayoutParameters.Width;
}
var tempValue = androidHorizonetalSeekBar.Progress;
androidHorizonetalSeekBar.Progress = (int)(x / (Width - thumbButton.LayoutParameters.Width) * Max);
int width = (int)(androidHorizonetalSeekBar.Progress * 1.0 / androidHorizonetalSeekBar.Max * (Width - thumbButton.LayoutParameters.Width));
progressImageView.LayoutParameters.Width = width + thumbButton.LayoutParameters.Width / 2;
var layoutParameter = thumbButton.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
layoutParameter.LeftMargin = width;
thumbButton.LayoutParameters = layoutParameter;
if (tempValue != androidHorizonetalSeekBar.Progress || tempValue == 0 || tempValue == Max|| dateTime== DateTime.MinValue)
{
//点击下或者弹起或者滑动时间500毫秒的时候,就触发事件
if (ProgressChanged != null
&& SleepTime < (DateTime.Now - dateTime).TotalMilliseconds)
{
dateTime = DateTime.MinValue;
delayDateTime = DateTime.Now;
ProgressChanged(this, androidHorizonetalSeekBar.Progress);
}
}
}
int thumbRadius = 10;
public int ThumbRadius
{
get
{
return thumbRadius;
}
set
{
thumbRadius = value;
if (!IsCanRefresh)
{
return;
}
thumbButton.LayoutParameters.Width = Dip2Px(ThumbRadius) * 2;
thumbButton.LayoutParameters.Height = Dip2Px(ThumbRadius) * 2;
var gradientDrawable = thumbButton.Background as Android.Graphics.Drawables.GradientDrawable;
gradientDrawable.SetCornerRadius(Dip2Px(ThumbRadius));
gradientDrawable.SetSize(Dip2Px(ThumbRadius) * 2, Dip2Px(ThumbRadius) * 2);
thumbButton.Background = gradientDrawable;
ThumbColor = thumbColor;
}
}
public override void Refresh()
{
base.Refresh();
ThumbRadius = thumbRadius;
ProgressColor = progressColor;
Progress = androidHorizonetalSeekBar.Progress;
}
///
/// 需要重写的视图
///
class AndroidHorizontalSeekBar : Android.Widget.SeekBar
{
View view;
public AndroidHorizontalSeekBar(Context context, View view)
: base(context)
{
this.view = view;
ProgressDrawable = null;
SetThumb(null);
}
///
/// 如果已经是横向滑动,父控件不允许再请求中断
///
bool isHorizontalActioned;
///
/// 记录最后点击的X轴坐标
///
float mLastMotionX;
///
/// 点击Y轴的坐标
///
float mLastMotionY;
public override bool OnTouchEvent(MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
isHorizontalActioned = false;
//进来的时候禁止父控制打断
Parent?.RequestDisallowInterceptTouchEvent(true);
//记录点击的X坐标
mLastMotionX = e.RawX;
mLastMotionY = e.RawY;
break;
case MotionEventActions.Move:
var deltaX = mLastMotionX - e.RawX;
var deltaY = mLastMotionY - e.RawY;
//如果主要滑动的是Y轴比较大,返回
if (Math.Abs(deltaX) < Math.Abs(deltaY))
{
if (ViewConfiguration.Get(Context).ScaledTouchSlop < Math.Abs(deltaY) && !isHorizontalActioned)
{
Parent?.RequestDisallowInterceptTouchEvent(false);
}
return true;
}
//如果不在滑动范围内,不执行滑动
if (Math.Abs(deltaX) < ViewConfiguration.Get(Context).ScaledTouchSlop)
{
return true;
}
isHorizontalActioned = true;
view?.TouchEvent(e);
break;
case MotionEventActions.Up:
view?.TouchEvent(e);
break;
}
return true;
}
}
}
}