日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之自定义控件入门

發(fā)布時(shí)間:2024/7/23 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。