实例讲解Android应用中自定义组合控件的方法

实例讲解Android应用中自定义组合控件的方法,第1张

概述自定义view大概可以分成:继承view组合view自己画的view(用paint和canvas)自定义viewgroup(widget)

自定义view大概可以分成:

继承vIEw 组合vIEw 自己画的vIEw(用paint和canvas) 自定义viewgroup(Widget)

最近又跟同学聊起来了,于是就准备自己实现一个imagebutton来练练手。(最简单的了)以及后面一个把imagevIEw与textvIEw结合使用的案例。

Imagebutton
要实现Imagebutton最容易想到的不就是把button和imagevIEw合在一起么。嗯,人容易就想到这是一个组合自定义view。可是如何把一个image放到button上呢,自然就是用一个FrameLayout把button和imagevIEw包裹起来,然后将这个layout当作一个weIDgt。把一个layout当成一个控件我开始不太理解。后来了解到一些东西。

补充知识点(安卓的顶层视图)
在androID里面,你的app界面的活动的视图并非是最顶级的视图。大家应该都知道vIEwtree。在安卓里面,最顶级的视图是一个叫DecorVIEw的东西。它包括你的状态栏,标题栏,以及你的活动界面。而且这个活动界面,安卓会自动帮你提前弄进去一个FrameLayout。可以这么理解吧,在安卓这个上帝的面前,你的activity就是放在他的framelayout的一个个vIEw。上一张图~

DecorVIEw->linearLayout(状态栏和activity)->FrameLayout(activity)->你自己的acitivty视图。

实例讲解
好啦,回归正题。我上代码了。
myimagebutton_layout.xml

<FrameLayout   xmlns:androID="http://schemas.androID.com/apk/res/androID"     androID:layout_wIDth="match_parent"        androID:layout_height="match_parent">   <button      androID:layout_wIDth="match_parent"      androID:layout_height="match_parent"      androID:ID="@+ID/button_imagebutton"    />   <ImageVIEw   androID:layout_wIDth="match_parent"      androID:layout_height="match_parent"      androID:ID="@+ID/imagevIEw_button"    /></FrameLayout>

用一个framelayout把两个控件装起来,然后组合。组合了之后我们就去自定义我们这个控件的属性。button不用变对吧,用原生的就好了,就是需要有一个图片的src这个属性就好了。
在values目录下的attrs.xml文件_

<?xml version="1.0" enCoding="utf-8"?><resources>在  <declare-styleable name="MyImagebutton">    <attr name="Imagesrc" format="reference"/>  </declare-styleable></resources>

一般来说,declare-styleable标签的名字都是你的自定义控件的名字。attr就是你的自定义控件属性。format是这个属性的值的数据类型。这里的reference表示引用。dimension表示的是dp或者sp的大小。还有一些可以自己去看看。定义好属性,我们就开始写控件了。
MyImagebutton.java

public class MyImagebutton2 extends FrameLayout{  ImageVIEw mImageVIEw;  button mbutton;  int resID;  public MyImagebutton2(Context context) {    super(context);  }  public MyImagebutton2(Context context,AttributeSet attrs) {    super(context,attrs);    //导入布局    LayoutInflater.from(context).inflate(R.layout.myimagebutton_layout,this);   mImageVIEw=(ImageVIEw)findVIEwByID(R.ID.imagevIEw_button);   mbutton = (button) findVIEwByID(R.ID.button_imagebutton);    //获得这个控件对应的属性。   TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.MyImagebutton);    try{     //获得属性值      resID = a.getResourceID(R.styleable.MyImagebutton_Imagesrc,0);    }finally {     //回收这个对象      a.recycle();    }    if(resID != 0){      mImageVIEw.setimageResource(resID);    }  }  public voID setimage(int resID){    mImageVIEw.setimageResource(resID);  }}

一般来说,继承vIEw(就这么说吧,反正都是都是继承vIEw的),实现两三个构造函数就可以了。在第二个里面有一个attr,这就是传进来的属性。如果resID不为默认值,就表示用户在xml里面传入了这个属性值,你也必须要写一个set方法,让用户可以在java代码中去改变属性值。
test.myimagebutton.layout.xml_

<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"  androID:orIEntation="vertical"  androID:layout_wIDth="match_parent"  androID:layout_height="match_parent">  <com.example.think.testvIEw.customvIEw.MyImagebutton2    xmlns:pt = "http://schemas.androID.com/apk/res/com.example.think.testvIEw"    androID:layout_height="100dp"    androID:layout_wIDth="match_parent"    pt:Imagesrc = "@drawable/ic_launcher"    /></linearLayout>

效果图

另一个实例

这里我们来看一个vIEw组合控件的例子:

<string-array name="bao_type">    <item>测试1</item>    <item>测试2</item>    <item>测试3</item>    <item>测试4</item>  </string-array> 
<?xml version="1.0" enCoding="utf-8"?> <linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   androID:layout_wIDth="match_parent"   androID:layout_height="match_parent"   androID:background="@color/gray_common_background"   androID:orIEntation="vertical">      <linearLayout     androID:layout_wIDth="match_parent"     androID:layout_height="wrap_content"     androID:orIEntation="horizontal">      <TextVIEw       androID:ID="@+ID/txt_vIEwpage_bar1"              androID:textcolor="@color/theme_red" />      <TextVIEw       androID:ID="@+ID/txt_vIEwpage_bar2"        />      <TextVIEw       androID:ID="@+ID/txt_vIEwpage_bar3"        />      <TextVIEw       androID:ID="@+ID/txt_vIEwpage_bar4"        />   </linearLayout>    <linearLayout     androID:layout_wIDth="match_parent"     androID:layout_height="wrap_content"     androID:orIEntation="horizontal">      <VIEw       androID:ID="@+ID/vIEw_vIEwpage_bar1"        />      <VIEw       androID:ID="@+ID/vIEw_vIEwpage_bar2"        />      <VIEw       androID:ID="@+ID/vIEw_vIEwpage_bar3"        />      <VIEw       androID:ID="@+ID/vIEw_vIEwpage_bar4"        />   </linearLayout>      <androID.support.v4.vIEw.VIEwPager     androID:ID="@+ID/common_vIEwpage_buttom"     androID:layout_wIDth="match_parent"     androID:layout_height="0dp"     androID:layout_weight="1" /> </linearLayout> 
public interface SlbPageVIEwOnPagechangelistener {    voID onPageSelected(int position);     voID onPageScrollStateChanged(int state);  } 
public class SlbPageVIEwbar extends linearLayout {   private TextVIEw[] mTotalTxtVIEws;   private VIEw[] mTotalVIEws;   private List<TextVIEw> mTxtVIEws;   private List<VIEw> mVIEws;    private VIEwPager mVIEwPager;   private SlbPageVIEwOnPagechangelistener mSlbPageVIEwOnPagechangelistener;     public SlbPageVIEwbar(Context context,AttributeSet attrs) {     super(context,attrs);     mTotalTxtVIEws = new TextVIEw[4];     mTotalVIEws = new VIEw[4];     mTxtVIEws = new ArrayList<>();     mVIEws = new ArrayList<>();     initVIEw();   }    private voID initVIEw() {     VIEw.inflate(getContext(),R.layout.layout_common_top_pagevIEw_bar,this);     mVIEwPager = (VIEwPager) findVIEwByID(R.ID.common_vIEwpage_buttom);     mTotalTxtVIEws[0] = (TextVIEw) findVIEwByID(R.ID.txt_vIEwpage_bar1);     mTotalTxtVIEws[1] = (TextVIEw) findVIEwByID(R.ID.txt_vIEwpage_bar2);     mTotalTxtVIEws[2] = (TextVIEw) findVIEwByID(R.ID.txt_vIEwpage_bar3);     mTotalTxtVIEws[3] = (TextVIEw) findVIEwByID(R.ID.txt_vIEwpage_bar4);     mTotalVIEws[0] = findVIEwByID(R.ID.vIEw_vIEwpage_bar1);     mTotalVIEws[1] = findVIEwByID(R.ID.vIEw_vIEwpage_bar2);     mTotalVIEws[2] = findVIEwByID(R.ID.vIEw_vIEwpage_bar3);     mTotalVIEws[3] = findVIEwByID(R.ID.vIEw_vIEwpage_bar4);    }    /**    * @param Title 标题名称数组    */    public voID setTitleVIEw(String[] Title) {     int legth = Title.length > 4 ? 4 : Title.length;     for (int i = 0; i < legth; i++) {       mTotalTxtVIEws[i].setText(Title[i]);       mTotalTxtVIEws[i].setVisibility(VIEw.VISIBLE);       mTotalVIEws[i].setVisibility(VIEw.INVISIBLE);       mTotalTxtVIEws[i].setonClickListener(new SlbTextVIEwOnLister(i));       mTxtVIEws.add(mTotalTxtVIEws[i]);       mVIEws.add(mTotalVIEws[i]);     }     mTotalVIEws[0].setVisibility(VIEw.VISIBLE);     mVIEwPager.setonPagechangelistener(mOnButtomPagechangelistener);   }    public VIEwPager getVIEwPager(){     return mVIEwPager;   }    public voID setSlbPageVIEwOnPagechangelistener(SlbPageVIEwOnPagechangelistener slbPageVIEwOnPagechangelistener) {     this.mSlbPageVIEwOnPagechangelistener = slbPageVIEwOnPagechangelistener;   }    private voID changeVIEwBg(int textVIEwID,int vIEwID) {     for (VIEw vIEw : mVIEws) {       if (vIEwID == vIEw.getID()) {         vIEw.setVisibility(VIEw.VISIBLE);       } else {         vIEw.setVisibility(VIEw.INVISIBLE);       }     }     for (TextVIEw vIEw : mTxtVIEws) {       if (textVIEwID == vIEw.getID()) {         vIEw.setTextcolor(getResources().getcolor(R.color.theme_red));       } else {         vIEw.setTextcolor(getResources().getcolor(R.color.black_normal_text_33333));       }     }   }     class SlbTextVIEwOnLister implements OnClickListener {      private int mItem;       public SlbTextVIEwOnLister(int item) {       this.mItem = item;      }      @OverrIDe     public voID onClick(VIEw v) {       mVIEwPager.setCurrentItem(mItem);     }   }    private VIEwPager.OnPagechangelistener mOnButtomPagechangelistener = new VIEwPager.OnPagechangelistener() {     @OverrIDe     public voID onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {      }      @OverrIDe     public voID onPageSelected(int position) {       switch (position) {         case 0:           changeVIEwBg(R.ID.txt_vIEwpage_bar1,R.ID.vIEw_vIEwpage_bar1);           break;         case 1:           changeVIEwBg(R.ID.txt_vIEwpage_bar2,R.ID.vIEw_vIEwpage_bar2);            break;         case 2:           changeVIEwBg(R.ID.txt_vIEwpage_bar3,R.ID.vIEw_vIEwpage_bar3);           break;         case 3:           changeVIEwBg(R.ID.txt_vIEwpage_bar4,R.ID.vIEw_vIEwpage_bar4);           break;       }       if (mSlbPageVIEwOnPagechangelistener != null)         mSlbPageVIEwOnPagechangelistener.onPageSelected(position);     }      @OverrIDe     public voID onPageScrollStateChanged(int state) {       if (mSlbPageVIEwOnPagechangelistener != null)         mSlbPageVIEwOnPagechangelistener.onPageScrollStateChanged(state);     }   };   } 
public class CommonVIEwpageAdapter extends FragmentPagerAdapter {   private List<Fragment> mFragments;   private String [] mTitles;    public CommonVIEwpageAdapter(FragmentManager fm,List<Fragment> fragments,String [] Titles) {     super(fm);     mFragments = fragments;     mTitles = Titles;   }    @OverrIDe   public Fragment getItem(int position) {     return mFragments.get(position);   }    @OverrIDe   public int getCount() {     return mFragments.size();   }    @OverrIDe   public CharSequence getPageTitle(int position) {     return mTitles[position];   }    @OverrIDe   public voID destroyItem(VIEwGroup container,int position,Object object) {     super.destroyItem(container,position,object);   } } 
<com.slfinance.app.slb.common.ui.vIEw.SlbPageVIEwbar     androID:ID="@+ID/slbpv_buy_huoqibao_SlbPageVIEwbarshow"     androID:layout_wIDth="match_parent"     androID:layout_height="wrap_content"     androID:orIEntation="vertical"/> 
private voID initButtomPageFragment(SlbPageVIEwbar slbPageVIEwbar) {   List<Fragment> fragmentList = new ArrayList<>();   Test1Fragment test1Fragment = new Test1Fragment();   Test2Fragment test2Fragment = new Test2Fragment();   Test3Fragment test3Fragment = new Test3Fragment();   Test4Fragment test4Fragment = new Test4Fragment();   fragmentList.add(test1Fragment);   fragmentList.add(test2Fragment);   fragmentList.add(test3Fragment);   fragmentList.add(test4Fragment);   String[] Titles = getResources().getStringArray(R.array.buy_huoqi_bao_zanquan_detail);   slbPageVIEwbar.setTitleVIEw(Titles);   CommonVIEwpageAdapter vIEwPagerAdapter = new CommonVIEwpageAdapter(       getSupportFragmentManager(),fragmentList,Titles);   mButtomPageVIEw.setAdapter(vIEwPagerAdapter);   mButtomPageVIEw.setoffscreenPagelimit(3);   mButtomPageVIEw.setCurrentItem(0); } 


总结

以上是内存溢出为你收集整理的实例讲解Android应用中自定义组合控件的方法全部内容,希望文章能够帮你解决实例讲解Android应用中自定义组合控件的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1149455.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存