Android之自定义控件入门
生活随笔
收集整理的這篇文章主要介紹了
Android之自定义控件入门
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文主要講述了實(shí)現(xiàn)安卓button點(diǎn)擊變色與利用ViewPager實(shí)現(xiàn)圖片自動(dòng)輪播效果
我傘可以看到在很多應(yīng)用中,安卓按鈕按下時(shí)與正常時(shí)狀態(tài)是不同的,這種效果也很容易達(dá)到。
第一步:創(chuàng)建XML文件定義不同事件的不同效果
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"android:drawable="@drawable/function_greenbutton_pressed" /> <!-- pressed --><item android:state_focused="true"android:drawable="@drawable/function_greenbutton_pressed" /> <!-- focused --><item android:drawable="@drawable/function_greenbutton_normal" /> <!-- default --> </selector>在上面就定義了在pressed與normal情況下,安卓的圖片會(huì)自動(dòng)替換的效果。
第二步:在布局文件中加入定義好的按鈕就可以了
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按下文字會(huì)變效果" android:textColor="@drawable/btn_color" android:background="@drawable/btn_bg" />利用ViewPager實(shí)現(xiàn)自動(dòng)輪播圖片
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><android.support.v4.view.ViewPager android:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="200dp" /><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignBottom="@id/viewpager"android:background="#33000000"android:orientation="vertical" ><TextView android:id="@+id/image_desc"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@string/app_name"android:textColor="@android:color/white"android:textSize="18sp" /><LinearLayout android:id="@+id/point_group"android:layout_width="wrap_content"android:layout_gravity="center_horizontal"android:layout_height="wrap_content" ></LinearLayout></LinearLayout></RelativeLayout>注意viewPager引入時(shí)要用全類名,上面還定義了圖片介紹與圖片切換時(shí)小圓點(diǎn)也會(huì)切換
viewPager的主要方法
//設(shè)置適配器adapterviewPager.setAdapter(new MyPagerAdapter()); //設(shè)置當(dāng)前的位置,輪播到哪一個(gè)圖片了 viewPager.setCurrentItem(Integer.MAX_VALUE/2 - (Integer.MAX_VALUE/2%imageList.size())) ; //設(shè)置viewPager的監(jiān)聽事件 viewPager.setOnPageChangeListener(new OnPageChangeListener()實(shí)現(xiàn)
適配器
private class MyPagerAdapter extends PagerAdapter {@Override/*** 獲得頁面的總數(shù)*/public int getCount() {return Integer.MAX_VALUE;}@Override/*** 獲得相應(yīng)位置上的view* container view的容器,其實(shí)就是viewpager自身* position 相應(yīng)的位置*/public Object instantiateItem(ViewGroup container, int position) {System.out.println("instantiateItem ::"+position);// 給 container 添加一個(gè)viewcontainer.addView(imageList.get(position%imageList.size()));//返回一個(gè)和該view相對(duì)的objectreturn imageList.get(position%imageList.size());}@Override/*** 判斷 view和object的對(duì)應(yīng)關(guān)系 */public boolean isViewFromObject(View view, Object object) {if(view == object){return true;}else{return false;}}@Override/*** 銷毀對(duì)應(yīng)位置上的object*/public void destroyItem(ViewGroup container, int position, Object object) {System.out.println("destroyItem ::"+position);container.removeView((View) object);object = null;}}將當(dāng)前頁面總數(shù)設(shè)大一點(diǎn),就可以實(shí)現(xiàn)無限循環(huán)了,viewpager總是只保持三個(gè)窗口,循環(huán)利用,并不會(huì)造成內(nèi)存浪費(fèi),將當(dāng)前項(xiàng)設(shè)置在中間,就可以左右自動(dòng)循環(huán)了
事件監(jiān)聽實(shí)現(xiàn)
viewPager.setOnPageChangeListener(new OnPageChangeListener() {@Override/*** 頁面切換后調(diào)用 * position 新的頁面位置*/public void onPageSelected(int position) {position = position%imageList.size();//設(shè)置文字描述內(nèi)容iamgeDesc.setText(imageDescriptions[position]);//改變指示點(diǎn)的狀態(tài)//把當(dāng)前點(diǎn)enbale 為true pointGroup.getChildAt(position).setEnabled(true);//把上一個(gè)點(diǎn)設(shè)為falsepointGroup.getChildAt(lastPosition).setEnabled(false);lastPosition = position;}@Override/*** 頁面正在滑動(dòng)的時(shí)候,回調(diào)*/public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}@Override/*** 當(dāng)頁面狀態(tài)發(fā)生變化的時(shí)候,回調(diào)*/public void onPageScrollStateChanged(int state) {}});實(shí)現(xiàn)自動(dòng)播放
實(shí)現(xiàn)循環(huán)有以下幾種方法
自動(dòng)循環(huán):
1、定時(shí)器:Timer
2、開子線程 while true 循環(huán)
3、ColckManager
4、 用handler 發(fā)送延時(shí)信息,實(shí)現(xiàn)循環(huán)
這里采用第四種
在onCreate方法中
isRunning = true;handler.sendEmptyMessageDelayed(0, 2000);定義handler
/*** 判斷是否自動(dòng)滾動(dòng)*/private boolean isRunning = false;private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {//讓viewPager 滑動(dòng)到下一頁viewPager.setCurrentItem(viewPager.getCurrentItem()+1);if(isRunning){handler.sendEmptyMessageDelayed(0, 2000);}};};protected void onDestroy() {isRunning = false;};另外,關(guān)于layoutParams 的一些小知識(shí)
//添加指示點(diǎn) ImageView point =new ImageView(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.rightMargin = 20; point.setLayoutParams(params); point.setBackgroundResource(R.drawable.point_bg);當(dāng)元素是在LinearLayout中時(shí),就要用LinearLayout.LayoutParams,在relativeLayout中時(shí),就要用relativeLayout.LayoutParams
實(shí)現(xiàn)效果
總結(jié)
以上是生活随笔為你收集整理的Android之自定义控件入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟Struts2实现
- 下一篇: Android之数据库操作