using System;
|
using Android.Content;
|
using Android.Runtime;
|
using Android.Views;
|
using Android.Util;
|
using Android.Graphics.Drawables;
|
using Android.Views.Animations;
|
using Android.Graphics;
|
using Android.OS;
|
using Android.Views.InputMethods;
|
using Android.Text;
|
|
namespace Shared
|
{
|
|
|
//已经全面检查了代码
|
/// <summary>
|
/// Button 按键
|
/// </summary>
|
public class Button : View
|
{
|
/// <summary>
|
/// 当前视图
|
/// </summary>
|
/// <value>The android button.</value>
|
AndroidButton currentButton {
|
get {
|
return AndroidView as AndroidButton;
|
}
|
set {
|
AndroidView = value;
|
}
|
}
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public Button ()
|
{
|
currentButton = new AndroidButton (Application.Activity, this);
|
currentButton.SetTextSize (ComplexUnitType.Sp, Application.FontSize);
|
|
}
|
|
byte[] imageBytes;
|
public byte[] ImageBytes
|
{
|
get
|
{
|
return imageBytes;
|
}
|
set
|
{
|
imageBytes = value;
|
IsSelected = isSelected;
|
}
|
}
|
/// <summary>
|
/// 文字大小
|
/// </summary>
|
/// <value>The size of the text.</value>
|
public float TextSize {
|
get {
|
return currentButton.TextSize;
|
}
|
set {
|
currentButton.SetTextSize (ComplexUnitType.Sp, value);
|
}
|
}
|
|
int textID;
|
/// <summary>
|
/// 根据ID获取对应的备注
|
/// </summary>
|
/// <value>The text I.</value>
|
public int TextID {
|
get {
|
return textID;
|
}
|
set {
|
textID = value;
|
Text = Language.StringByID (TextID);
|
}
|
}
|
|
/// <summary>
|
/// 文本
|
/// </summary>
|
/// <value>The text.</value>
|
public string Text {
|
get {
|
return currentButton.Text;
|
}
|
set {
|
|
currentButton.Text = value;
|
}
|
}
|
|
///// <summary>
|
///// 字体名称
|
///// </summary>
|
///// <value>The name of the font.</value>
|
//public string FontName {
|
// get {
|
// return "";
|
// }
|
// set {
|
// var typeFace = Typeface.CreateFromAsset (Shared.Application.Activity.Assets, "titilliumtext25l005.otf");
|
// if (typeFace != null) {
|
// currentButton.SetTypeface (typeFace, TypefaceStyle.Normal);
|
// }
|
// }
|
//}
|
|
///// <summary>
|
///// 普通字体
|
///// </summary>
|
//string mFontNameNormal;
|
//Typeface typeFaceNormal;
|
//public string FontNameNormal {
|
// get
|
// {
|
// return mFontNameNormal;
|
// }
|
// set
|
// {
|
// mFontNameNormal = value;
|
|
// var typeFace = Typeface.CreateFromAsset(Shared.Application.Activity.Assets, mFontNameNormal);
|
// if (typeFace != null)
|
// {
|
// typeFaceNormal = typeFace;
|
// }
|
// }
|
//}
|
|
//string mFontNameBold;
|
//Typeface typeFaceBold;
|
//public string FontNameBold
|
//{
|
// get
|
// {
|
// return mFontNameBold;
|
// }
|
// set
|
// {
|
// mFontNameBold = value;
|
|
// var typeFace = Typeface.CreateFromAsset(Shared.Application.Activity.Assets, mFontNameBold);
|
// if (typeFace != null)
|
// {
|
// typeFaceBold = typeFace;
|
// }
|
// }
|
//}
|
|
|
|
string mFontName;
|
/// <summary>
|
/// 字体名称
|
/// </summary>
|
/// <value>The name of the font.</value>
|
public string FontName
|
{
|
get
|
{
|
return mFontName;
|
}
|
set
|
{
|
try
|
{
|
var typeFace = Typeface.CreateFromAsset(Shared.Application.Activity.Assets, value);
|
if (typeFace != null)
|
{
|
mFontName = value;
|
currentButton.SetTypeface(typeFace, TypefaceStyle.Normal);
|
}
|
}
|
catch {
|
}
|
}
|
}
|
|
bool isMoreLines;
|
public bool IsMoreLines {
|
get {
|
return isMoreLines;
|
}
|
set {
|
isMoreLines = value;
|
currentButton.SetSingleLine (!value);
|
}
|
}
|
|
/// <summary>
|
/// 是否显示粗体
|
/// </summary>
|
bool isBold;
|
public bool IsBold
|
{
|
get
|
{
|
return isBold;
|
}
|
set
|
{
|
isBold = value;
|
if (isBold)
|
{
|
currentButton.SetTypeface(Typeface.DefaultFromStyle(TypefaceStyle.Bold), TypefaceStyle.Bold);
|
}
|
else {
|
currentButton.SetTypeface(Typeface.DefaultFromStyle(TypefaceStyle.Normal), TypefaceStyle.Normal);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 获取字体长度
|
/// </summary>
|
public int GetTextWidth()
|
{
|
|
TextPaint textPaint = new TextPaint();
|
textPaint.TextSize = this.TextSize;
|
return (int)textPaint.MeasureText(this.Text);
|
}
|
|
/// <summary>
|
/// 刷新
|
/// </summary>
|
public override void Refresh ()
|
{
|
base.Refresh ();
|
IsSelected = isSelected;
|
}
|
|
uint textColor = 0xFFFFFFFF;
|
/// <summary>
|
/// 文字颜色
|
/// </summary>
|
/// <value>The color of the text.</value>
|
public uint TextColor {
|
get {
|
return textColor;
|
}
|
set {
|
textColor = value;
|
if (IsSelected) {
|
return;
|
}
|
byte r, g, b, a;
|
r = (byte)(textColor / 256 / 256 % 256);
|
g = (byte)(textColor / 256 % 256);
|
b = (byte)(textColor % 256);
|
a = (byte)(textColor / 256 / 256 / 256 % 256);
|
|
currentButton.SetTextColor (Android.Graphics.Color.Argb (a, r, g, b));
|
}
|
}
|
|
uint selecteTextColor = 0xFFFFFFFF;
|
/// <summary>
|
/// 文字颜色
|
/// </summary>
|
/// <value>The color of the text.</value>
|
public uint SelectedTextColor {
|
get {
|
return selecteTextColor;
|
}
|
set {
|
selecteTextColor = value;
|
if (!IsSelected) {
|
return;
|
}
|
byte r, g, b, a;
|
r = (byte)(selecteTextColor / 256 / 256 % 256);
|
g = (byte)(selecteTextColor / 256 % 256);
|
b = (byte)(selecteTextColor % 256);
|
a = (byte)(selecteTextColor / 256 / 256 / 256 % 256);
|
|
currentButton.SetTextColor (Android.Graphics.Color.Argb (a, r, g, b));
|
}
|
}
|
|
bool isSelected;
|
/// <summary>
|
/// 选中状态
|
/// </summary>
|
/// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value>
|
public bool IsSelected {
|
get {
|
return isSelected;
|
}
|
set {
|
isSelected = value;
|
if (!IsCanRefresh) {
|
return;
|
}
|
if (isSelected) {
|
if (SelectedImagePath == null) {
|
SelectedBackgroundColor = SelectedBackgroundColor;
|
} else {
|
Background (SelectedImagePath);
|
}
|
SelectedTextColor = selecteTextColor;
|
} else {
|
if (imageBytes != null)
|
{
|
AndroidView.Background = Bytes2Drawable(imageBytes);
|
return;
|
}
|
if (UnSelectedImagePath == null) {
|
BackgroundColor = BackgroundColor;
|
} else {
|
Background (UnSelectedImagePath);
|
}
|
TextColor = textColor;
|
}
|
}
|
}
|
|
|
|
|
TextAlignment textAlignment = TextAlignment.Center;
|
/// <summary>
|
/// 文字对齐方式
|
/// </summary>
|
/// <param name="horizontalAlignment">横向</param>
|
/// <param name="verticalAlignment">纵向</param>
|
public TextAlignment TextAlignment {
|
get {
|
return textAlignment;
|
}
|
set {
|
textAlignment = value;
|
switch (value) {
|
case TextAlignment.TopLeft:
|
currentButton.Gravity = GravityFlags.Top | GravityFlags.Left;
|
break;
|
case TextAlignment.TopCenter:
|
currentButton.Gravity = GravityFlags.Top | GravityFlags.Center;
|
break;
|
case TextAlignment.TopRight:
|
currentButton.Gravity = GravityFlags.Top | GravityFlags.Right;
|
break;
|
case TextAlignment.CenterLeft:
|
currentButton.Gravity = GravityFlags.Center | GravityFlags.Left;
|
break;
|
case TextAlignment.Center:
|
currentButton.Gravity = GravityFlags.Center | GravityFlags.Center;
|
break;
|
case TextAlignment.CenterRight:
|
currentButton.Gravity = GravityFlags.Center | GravityFlags.Right;
|
break;
|
case TextAlignment.BottomLeft:
|
currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Left;
|
break;
|
case TextAlignment.BottomCenter:
|
currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Center;
|
break;
|
case TextAlignment.BottomRight:
|
currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Right;
|
break;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 内边距
|
/// </summary>
|
/// <value>The padding.</value>
|
public override Padding Padding {
|
get {
|
return new Padding (currentButton.PaddingTop, currentButton.PaddingLeft, currentButton.PaddingBottom, currentButton.PaddingRight);
|
}
|
set {
|
currentButton.SetPadding (value.Left, value.Top, value.Right, value.Bottom);
|
}
|
}
|
|
string selectedImagePath;
|
/// <summary>
|
/// 选择时背景图路径
|
/// </summary>
|
/// <value>The selected image path.</value>
|
public string SelectedImagePath {
|
get {
|
return selectedImagePath;
|
}
|
set {
|
selectedImagePath = value;
|
IsSelected = isSelected;
|
}
|
}
|
|
string unSelectedImagePath;
|
/// <summary>
|
/// 非选中状态的背景图路径
|
/// </summary>
|
/// <value>The un selected image path.</value>
|
public string UnSelectedImagePath {
|
get {
|
return unSelectedImagePath;
|
}
|
set {
|
unSelectedImagePath = value;
|
IsSelected = isSelected;
|
}
|
}
|
|
uint selectedBackgroundColor;
|
/// <summary>
|
/// 选择时背景颜色
|
/// </summary>
|
/// <value>The color of the text.</value>
|
public uint SelectedBackgroundColor {
|
get {
|
return selectedBackgroundColor;
|
}
|
set {
|
selectedBackgroundColor = value;
|
if (AndroidView.Background == null || AndroidView.Background.GetType () != typeof (GradientDrawable)) {
|
AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable ();
|
}
|
|
var gradientDrawable = (GradientDrawable)AndroidView.Background;
|
gradientDrawable.SetCornerRadius (DensityUtil.Dip2Px (Radius));
|
byte r, g, b, a;
|
r = (byte)(BorderColor / 256 / 256 % 256);
|
g = (byte)(BorderColor / 256 % 256);
|
b = (byte)(BorderColor % 256);
|
a = (byte)(BorderColor / 256 / 256 / 256 % 256);
|
gradientDrawable.SetStroke ((int)BorderWidth, Android.Graphics.Color.Argb (a, r, g, b));
|
|
r = (byte)(selectedBackgroundColor / 256 / 256 % 256);
|
g = (byte)(selectedBackgroundColor / 256 % 256);
|
b = (byte)(selectedBackgroundColor % 256);
|
a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256);
|
gradientDrawable.SetColor (Android.Graphics.Color.Argb (a, r, g, b).ToArgb ());
|
}
|
|
}
|
|
internal class AndroidButton : Android.Widget.Button
|
{
|
View view;
|
public AndroidButton (Context context, View view)
|
: base (context)
|
{
|
this.view = view;
|
SetBackgroundColor (Android.Graphics.Color.Transparent);
|
SetPadding (0, 0, 0, 0);
|
SetTextColor (Android.Graphics.Color.White);
|
SetLines (1);
|
SetEllipsize (true);
|
}
|
|
public override bool OnTouchEvent (MotionEvent e)
|
{
|
var v = base.OnTouchEvent (e);
|
view?.TouchEvent (e);
|
return true;
|
}
|
|
public void SetEllipsize (bool ellipsize) {
|
if (ellipsize) {
|
Ellipsize = TextUtils.TruncateAt.End;
|
} else {
|
Ellipsize = TextUtils.TruncateAt.Marquee;
|
}
|
}
|
|
public override TextUtils.TruncateAt Ellipsize { get => base.Ellipsize; set => base.Ellipsize = value; }
|
}
|
}
|
}
|