Android 自定义view实现TopBar

叁歲伎倆 2022-06-07 00:12 354阅读 0赞

布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:paddingBottom="@dimen/activity_vertical_margin"
  8. android:paddingLeft="@dimen/activity_horizontal_margin"
  9. android:paddingRight="@dimen/activity_horizontal_margin"
  10. android:paddingTop="@dimen/activity_vertical_margin"
  11. tools:context="com.bwie.test.MainActivity">
  12. <com.bwie.test.MyView
  13. xmlns:android="http://schemas.android.com/apk/res/android"
  14. xmlns:lt="http://schemas.android.com/apk/res-auto"
  15. android:id="@+id/titlebar"
  16. android:layout_width="match_parent"
  17. android:layout_height="60dp"
  18. lt:leftButtonText="返回"
  19. lt:leftButtonTextColor="@android:color/white"
  20. lt:leftButtonTextSize="8sp"
  21. lt:buttonBgColor="#4556ec"
  22. lt:titleText="标题"
  23. lt:titleColor="@android:color/white"
  24. lt:titleSize="8sp"
  25. lt:rightButtonText="完成"
  26. lt:rightButtonTextColor="@android:color/white"
  27. lt:rightButtonTextSize="8sp"
  28. android:background="#47ea10"
  29. android:padding="10sp"
  30. >
  31. </com.bwie.test.MyView>
  32. </RelativeLayout>

自定义属性attrs.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="Titlebar">
  4. <attr name="leftButtonText" format="string|reference"></attr>
  5. <attr name="leftButtonTextColor" format="color|reference"></attr>
  6. <attr name="leftButtonTextSize" format="dimension|reference"></attr>
  7. <attr name="leftButtonImage" format="color|reference"></attr>
  8. <attr name="buttonBgColor" format="color"/>
  9. <attr name="titleText" format="string|reference"></attr>
  10. <attr name="titleColor" format="color|reference"></attr>
  11. <attr name="titleSize" format="dimension|reference"></attr>
  12. <attr name="rightButtonText" format="string|reference"></attr>
  13. <attr name="rightButtonTextColor" format="color|reference"></attr>
  14. <attr name="rightButtonTextSize" format="dimension|reference"></attr>
  15. <attr name="rightButtonImage" format="color|reference"></attr>
  16. </declare-styleable>
  17. </resources>

自定义View的Class类

  1. public class MyView extends RelativeLayout{
  2. private String mLeftButtonText;
  3. private int mLeftButtonTextColor;
  4. private float mLeftButtonSize;
  5. private Drawable mLeftButtonImage;
  6. private String mTitleButtonText;
  7. private int mTitleButtonTextColor;
  8. private float mTitleButtonSize;
  9. private String mRightButtonText;
  10. private int mRightButtonTextColor;
  11. private float mRightButtonSize;
  12. private Drawable mRightButtonImage;
  13. private TextView mRightTextView;
  14. private TextView titleTextView;
  15. private ImageView mLeftButton;
  16. private TextView mLeftTextView;
  17. private ImageView mRightButton;
  18. int buttonBgColor;
  19. public MyView(Context context) {
  20. this(context,null);
  21. }
  22. public MyView(Context context, AttributeSet attrs) {
  23. this(context, attrs,0);
  24. TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Titlebar);
  25. buttonBgColor = typedArray.getColor(R.styleable.Titlebar_buttonBgColor,Color.BLUE);
  26. //左侧的按钮
  27. mLeftButtonText = typedArray.getString(R.styleable.Titlebar_leftButtonText);
  28. mLeftButtonTextColor = typedArray.getColor(R.styleable.Titlebar_leftButtonTextColor, Color.GRAY);
  29. mLeftButtonSize = typedArray.getDimension(R.styleable.Titlebar_leftButtonTextSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
  30. mLeftButtonImage = typedArray.getDrawable(R.styleable.Titlebar_leftButtonImage);
  31. //中间的按钮
  32. mTitleButtonText = typedArray.getString(R.styleable.Titlebar_titleText);
  33. mTitleButtonTextColor = typedArray.getColor(R.styleable.Titlebar_titleColor, Color.GRAY);
  34. mTitleButtonSize = typedArray.getDimension(R.styleable.Titlebar_titleSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
  35. //右侧的按钮
  36. mRightButtonText = typedArray.getString(R.styleable.Titlebar_rightButtonText);
  37. mRightButtonTextColor = typedArray.getColor(R.styleable.Titlebar_rightButtonTextColor, Color.GRAY);
  38. mRightButtonSize = typedArray.getDimension(R.styleable.Titlebar_rightButtonTextSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
  39. mRightButtonImage = typedArray.getDrawable(R.styleable.Titlebar_rightButtonImage);
  40. typedArray.recycle();//回收
  41. /*调用方法*/
  42. initView(context);
  43. }
  44. public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
  45. this(context, attrs, defStyleAttr,0);
  46. }
  47. public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  48. super(context, attrs, defStyleAttr, defStyleRes);
  49. }
  50. /*构建按钮*/
  51. private void initView(Context context) {
  52. if(mLeftButtonImage == null & mLeftButtonText != null){
  53. // 当用户没有设置左侧按钮图片并设置了左侧的按钮文本属性时--添加左侧文本按钮
  54. mLeftTextView = new TextView(context);
  55. mLeftTextView.setText(mLeftButtonText);
  56. mLeftTextView.setTextColor(mLeftButtonTextColor);
  57. mLeftTextView.setTextSize(mLeftButtonSize);
  58. mLeftTextView.setBackgroundColor(buttonBgColor);
  59. RelativeLayout.LayoutParams leftParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  60. leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
  61. leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
  62. addView(mLeftTextView, leftParams);
  63. }else if(mLeftButtonImage != null){
  64. // 添加左侧图片按钮
  65. RelativeLayout.LayoutParams leftParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  66. leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
  67. leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
  68. mLeftButton = new ImageView(context);
  69. mLeftButton.setImageDrawable(mLeftButtonImage);
  70. addView(mLeftButton, leftParams);
  71. }
  72. if(mTitleButtonText!=null){
  73. // 添加中间标题
  74. titleTextView = new TextView(context);
  75. titleTextView.setText(mTitleButtonText);
  76. titleTextView.setTextColor(mTitleButtonTextColor);
  77. titleTextView.setTextSize(mTitleButtonSize);
  78. RelativeLayout.LayoutParams titleTextViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  79. titleTextViewParams.addRule(RelativeLayout.CENTER_IN_PARENT);
  80. addView(titleTextView,titleTextViewParams);
  81. }
  82. if(mRightButtonImage == null & mRightButtonText != null){
  83. // 当用户没有设置右侧按钮图片并设置了左侧的按钮文本属性时--添加右侧文本按钮
  84. mRightTextView = new TextView(context);
  85. mRightTextView.setText(mRightButtonText);
  86. mRightTextView.setTextColor(mRightButtonTextColor);
  87. mRightTextView.setTextSize(mRightButtonSize);
  88. mRightTextView.setBackgroundColor(buttonBgColor);
  89. RelativeLayout.LayoutParams rightParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  90. rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  91. rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
  92. addView(mRightTextView,rightParams);
  93. }else if(mRightButtonImage != null){
  94. // 添加右侧图片按钮
  95. RelativeLayout.LayoutParams rightParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  96. rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  97. rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
  98. mRightButton = new ImageView(context);
  99. mRightButton.setImageDrawable(mRightButtonImage);
  100. addView(mRightButton, rightParams);
  101. }
  102. }
  103. /*监听事件*/
  104. public interface OnButtonClickListener{
  105. void onLeftClick();
  106. void onRightClick();
  107. }
  108. /*点击事件*/
  109. public void setOnButtonClickListener(final OnButtonClickListener onButtonClickListener) {
  110. if(onButtonClickListener !=null){
  111. if(mLeftTextView != null){
  112. mLeftTextView.setOnClickListener(new OnClickListener() {
  113. @Override
  114. public void onClick(View v) {
  115. onButtonClickListener.onLeftClick();
  116. }
  117. });
  118. }
  119. /*按钮*/
  120. if(mLeftButton != null){
  121. mLeftButton.setOnClickListener(new OnClickListener() {
  122. @Override
  123. public void onClick(View v) {
  124. onButtonClickListener.onLeftClick();
  125. }
  126. });
  127. }
  128. if(mRightTextView != null){
  129. mRightTextView.setOnClickListener(new OnClickListener() {
  130. @Override
  131. public void onClick(View v) {
  132. onButtonClickListener.onRightClick();
  133. }
  134. });
  135. }
  136. /*按钮*/
  137. if(mRightButton != null){
  138. mRightButton.setOnClickListener(new OnClickListener() {
  139. @Override
  140. public void onClick(View v) {
  141. onButtonClickListener.onRightClick();
  142. }
  143. });
  144. }
  145. }
  146. }

Main方法的代码调用自定义的类和点击事件

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. /*找到控件*/
  7. MyView Myview = (MyView) findViewById(R.id.titlebar);
  8. /*点击事件*/
  9. Myview.setOnButtonClickListener(new MyView.OnButtonClickListener() {
  10. @Override
  11. public void onLeftClick() {
  12. Toast.makeText(MainActivity.this,"左侧按钮被点击了",Toast.LENGTH_SHORT).show();
  13. }
  14. @Override
  15. public void onRightClick() {
  16. Toast.makeText(MainActivity.this,"右侧按钮被点击了",Toast.LENGTH_SHORT).show();
  17. }
  18. });
  19. }
  20. }

效果图:

20190311112233344.png

发表评论

表情:
评论列表 (有 0 条评论,354人围观)

还没有评论,来说两句吧...

相关阅读

    相关 android定义view

    最近弄的项目中在看到![Image 1][]这种![Center][]加减数量,如是就自己自定义了这样的view。 考虑到图标可能会被替换如是加了个attrs.xml文件,也

    相关 Android定义View

    1.View是什么? View是屏幕上的一块矩形区域,它负责用来显示一个区域,并且响应这个区域内的事件。可以说,手机屏幕上的任意一部分看的见得地方都是View,它很常见,比

    相关 Android定义View

    前几天在郭霖大神的博客上看了自定义View的知识,感觉受益良多,大神毕竟大神。在此总结一下关于Android 自定义View的用法: 首先,自定义View可以由基本控件或者组

    相关 Android定义View

    如何自定义控件 1. 自定义属性的声明和获取 2. 测量onMeasure:测量自定义控件的尺寸 3. 绘制onDraw:绘制自定义控件 4. 状态的存储与恢复: