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