Android 自定义view实现TopBar效果

本文实例为大家分享了Android自定义view实现TopBar的具体代码,供大家参考,具体内容如下

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.bwie.test.MainActivity"> 

  <com.bwie.test.MyView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:lt="http://schemas.android.com/apk/res-auto"
    android:id="@+id/titlebar"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    lt:leftButtonText="返回"
    lt:leftButtonTextColor="@android:color/white"
    lt:leftButtonTextSize="8sp"
    lt:buttonBgColor="#4556ec"
    lt:titleText="标题"
    lt:titleColor="@android:color/white"
    lt:titleSize="8sp"
    lt:rightButtonText="完成"
    lt:rightButtonTextColor="@android:color/white"
    lt:rightButtonTextSize="8sp"
    android:background="#47ea10"
    android:padding="10sp"
    >
  </com.bwie.test.MyView>
</RelativeLayout>

自定义属性attrs.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="Titlebar">
    <attr name="leftButtonText" format="string|reference"></attr>
    <attr name="leftButtonTextColor" format="color|reference"></attr>
    <attr name="leftButtonTextSize" format="dimension|reference"></attr>
    <attr name="leftButtonImage" format="color|reference"></attr>
    <attr name="buttonBgColor" format="color"/> 

    <attr name="titleText" format="string|reference"></attr>
    <attr name="titleColor" format="color|reference"></attr>
    <attr name="titleSize" format="dimension|reference"></attr> 

    <attr name="rightButtonText" format="string|reference"></attr>
    <attr name="rightButtonTextColor" format="color|reference"></attr>
    <attr name="rightButtonTextSize" format="dimension|reference"></attr>
    <attr name="rightButtonImage" format="color|reference"></attr> 

  </declare-styleable> 

</resources>

自定义View的Class类

public class MyView extends RelativeLayout{ 

  private String mLeftButtonText;
  private int mLeftButtonTextColor;
  private float mLeftButtonSize;
  private Drawable mLeftButtonImage;
  private String mTitleButtonText;
  private int mTitleButtonTextColor;
  private float mTitleButtonSize;
  private String mRightButtonText;
  private int mRightButtonTextColor;
  private float mRightButtonSize;
  private Drawable mRightButtonImage;
  private TextView mRightTextView;
  private TextView titleTextView;
  private ImageView mLeftButton;
  private TextView mLeftTextView;
  private ImageView mRightButton;
  int buttonBgColor;
  public MyView(Context context) {
    this(context,null);
  } 

  public MyView(Context context, AttributeSet attrs) {
    this(context, attrs,0);
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Titlebar);
    buttonBgColor = typedArray.getColor(R.styleable.Titlebar_buttonBgColor,Color.BLUE); 

//左侧的按钮
    mLeftButtonText = typedArray.getString(R.styleable.Titlebar_leftButtonText);
    mLeftButtonTextColor = typedArray.getColor(R.styleable.Titlebar_leftButtonTextColor, Color.GRAY);
    mLeftButtonSize = typedArray.getDimension(R.styleable.Titlebar_leftButtonTextSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
    mLeftButtonImage = typedArray.getDrawable(R.styleable.Titlebar_leftButtonImage);
//中间的按钮
    mTitleButtonText = typedArray.getString(R.styleable.Titlebar_titleText);
    mTitleButtonTextColor = typedArray.getColor(R.styleable.Titlebar_titleColor, Color.GRAY);
    mTitleButtonSize = typedArray.getDimension(R.styleable.Titlebar_titleSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
//右侧的按钮
    mRightButtonText = typedArray.getString(R.styleable.Titlebar_rightButtonText);
    mRightButtonTextColor = typedArray.getColor(R.styleable.Titlebar_rightButtonTextColor, Color.GRAY);
    mRightButtonSize = typedArray.getDimension(R.styleable.Titlebar_rightButtonTextSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
    mRightButtonImage = typedArray.getDrawable(R.styleable.Titlebar_rightButtonImage); 

    typedArray.recycle();//回收
    /*调用方法*/
    initView(context);
  } 

  public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr,0);
  } 

  public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
  }
  /*构建按钮*/
  private void initView(Context context) { 

    if(mLeftButtonImage == null & mLeftButtonText != null){
      // 当用户没有设置左侧按钮图片并设置了左侧的按钮文本属性时--添加左侧文本按钮
      mLeftTextView = new TextView(context);
      mLeftTextView.setText(mLeftButtonText);
      mLeftTextView.setTextColor(mLeftButtonTextColor);
      mLeftTextView.setTextSize(mLeftButtonSize);
      mLeftTextView.setBackgroundColor(buttonBgColor);
      RelativeLayout.LayoutParams leftParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
      leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
      addView(mLeftTextView, leftParams);
    }else if(mLeftButtonImage != null){
      // 添加左侧图片按钮
      RelativeLayout.LayoutParams leftParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
      leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
      mLeftButton = new ImageView(context);
      mLeftButton.setImageDrawable(mLeftButtonImage);
      addView(mLeftButton, leftParams);
    } 

    if(mTitleButtonText!=null){
      // 添加中间标题
      titleTextView = new TextView(context);
      titleTextView.setText(mTitleButtonText);
      titleTextView.setTextColor(mTitleButtonTextColor);
      titleTextView.setTextSize(mTitleButtonSize);
      RelativeLayout.LayoutParams titleTextViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      titleTextViewParams.addRule(RelativeLayout.CENTER_IN_PARENT);
      addView(titleTextView,titleTextViewParams);
    } 

    if(mRightButtonImage == null & mRightButtonText != null){
      // 当用户没有设置右侧按钮图片并设置了左侧的按钮文本属性时--添加右侧文本按钮
      mRightTextView = new TextView(context);
      mRightTextView.setText(mRightButtonText);
      mRightTextView.setTextColor(mRightButtonTextColor);
       mRightTextView.setTextSize(mRightButtonSize);
      mRightTextView.setBackgroundColor(buttonBgColor);
      RelativeLayout.LayoutParams rightParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
      rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
      addView(mRightTextView,rightParams);
    }else if(mRightButtonImage != null){
      // 添加右侧图片按钮
      RelativeLayout.LayoutParams rightParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
      rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
      mRightButton = new ImageView(context);
      mRightButton.setImageDrawable(mRightButtonImage);
      addView(mRightButton, rightParams);
    }
  }
  /*监听事件*/
  public interface OnButtonClickListener{
    void onLeftClick();
    void onRightClick();
  }
  /*点击事件*/
  public void setOnButtonClickListener(final OnButtonClickListener onButtonClickListener) {
    if(onButtonClickListener !=null){
      if(mLeftTextView != null){
        mLeftTextView.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            onButtonClickListener.onLeftClick();
          }
        });
      }
      /*按钮*/
      if(mLeftButton != null){
        mLeftButton.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            onButtonClickListener.onLeftClick();
          }
        });
      }
      if(mRightTextView != null){
        mRightTextView.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            onButtonClickListener.onRightClick();
          }
        });
      }
      /*按钮*/
      if(mRightButton != null){
        mRightButton.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            onButtonClickListener.onRightClick();
          }
        });
      }
    }
  }

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

public class MainActivity extends AppCompatActivity { 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    /*找到控件*/
    MyView Myview = (MyView) findViewById(R.id.titlebar);
    /*点击事件*/
    Myview.setOnButtonClickListener(new MyView.OnButtonClickListener() {
      @Override
      public void onLeftClick() {
        Toast.makeText(MainActivity.this,"左侧按钮被点击了",Toast.LENGTH_SHORT).show();
      } 

      @Override
      public void onRightClick() {
        Toast.makeText(MainActivity.this,"右侧按钮被点击了",Toast.LENGTH_SHORT).show();
      }
    }); 

  }
}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android之listview悬浮topBar效果

    虽然listview是过去式,但由于项目中还是有用listview,百度一番都是scrollview中的悬浮bar,没有看到有listview的悬浮bar,所以自己写一个悬浮bar:参照夏大神的scrollview的悬浮demo 效果如下: 自定义的Listview和scrollView没什么区别都是重写onScrollChange()然后在里边调用自己实现的接口,是对外提供的接口吧,这里没有封装,需要的可以自己将其封装,然后在自己项目中使用. 重点的方法: onScrollChanged()方

  • Android 自定义view实现TopBar效果

    本文实例为大家分享了Android自定义view实现TopBar的具体代码,供大家参考,具体内容如下 布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/t

  • Android自定义view实现太极效果实例代码

    Android自定义view实现太极效果实例代码 之前一直想要个加载的loading.却不知道用什么好,然后就想到了太极图标,最后效果是有了,不过感觉用来做loading简直丑到爆!!! 实现效果很简单,我们不要用什么贝塞尔曲线啥的,因为太极无非就是圆圆圆,只要画圆就ok了.来上代码: 因为有黑有白,所以定义2个画笔分别为黑和白. private void inital() { whitePaint = new Paint(); whitePaint.setAntiAlias(true); wh

  • Android自定义View实现打字机效果

    一.先来看看效果演示 二.实现原理: 这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效. 具体代码如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.media.MediaPlayer; import android.text.TextUtils; import android

  • Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子View产生滚动效果menuView.layout(menuLeft, 0, menuLeft + menuWidth, menuHeight); 相应的,由于没有使用scrollBy方法,就没有产生getScrollX值,所以不能通过Scroller的startScroll方法来完成手指离开后的平

  • Android自定义view实现圆环效果实例代码

    先上效果图,如果大家感觉不错,请参考实现代码.           重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePercentBar extends View{ private Context mContext; private int mArcColor; private int mArcWidth; private int mCenterTextColor; private int mCent

  • Android自定义View实现扫描效果

    本文实例为大家分享了Android自定义View实现扫描效果的具体代码,供大家参考,具体内容如下 演示效果如下: 实现内容: 1.控制动画是竖向或者横向 2.控制动画初始是从底部/左边开始,或者从上边/右边开始 3.控制动画的时常 4.可以自定义动画素材 具体实现: 自定义属性: <declare-styleable name="ScanView" tools:ignore="ResourceName"> <!--扫描的图片--> <a

  • Android自定义View实现时钟效果

    本文实例为大家分享了Android自定义View实现时钟效果的具体代码,供大家参考,具体内容如下 自定义时钟 初学自定义View,先画一个不太成熟的时钟(甚至只有秒针) 时钟效果 @SuppressLint("DrawAllocation") public class ClockView extends View {     private final Context mContext;     private Canvas mCanvas;// 画布     private Pain

  • Android自定义View实现风车效果

    本文实例为大家分享了Android自定义View实现风车效果的具体代码,供大家参考,具体内容如下 效果图: 画杆 public class WindmillRodView extends View {     private int mWidth;     private int mHeight;     private Paint mPaint;     public WindmillRodView(Context context) {         this(context, null);

  • Android自定义view实现输入框效果

    本文实例为大家分享了Android自定义view实现输入框的具体代码,供大家参考,具体内容如下 自定义输入框的View package com.fenghongzhang.day017; import android.content.Context; import android.content.res.TypedArray; import android.text.InputType; import android.util.AttributeSet; import android.view.

  • Android自定义view实现半圆环效果

    本文实例为大家分享了Android自定义view实现半圆环的具体代码,供大家参考,具体内容如下 1.自定义属性 <declare-styleable name="SemicircleView">         <attr name="radius" format="dimension" />         <attr name="strokeWidth" format="dimens

随机推荐