
自定义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应用中自定义组合控件的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)