Android開發實戰2----圓點導航指示器(使用自定義View實現)
一、專案概述
當我們使用viewpager進行圖片預覽時,底部一般情況都會出現圓點導航指示器,效果如圖所示:
二、不好的一種處理方式:
剛開始的情況下,我們會現在activity中先定義一個LinearLayout,然後對於這個LinearLayout進行增刪Imageview操作。比如:
這種編碼方式,把檢視顯示程式碼和業務邏輯操作程式碼混在一起了。程式碼顯得很論亂。@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); LayoutInflater inflater = getLayoutInflater(); pageViews = new ArrayList<View>(); pageViews.add(inflater.inflate(R.layout.viewpager01, null)); pageViews.add(inflater.inflate(R.layout.viewpager02, null)); pageViews.add(inflater.inflate(R.layout.viewpager03, null)); pageViews.add(inflater.inflate(R.layout.viewpager04, null)); pageViews.add(inflater.inflate(R.layout.viewpager05, null)); pageViews.add(inflater.inflate(R.layout.viewpager06, null)); // 小圓點陣列,大小是圖片的個數 imageViews = new ImageView[pageViews.size()]; // 從指定的XML檔案中載入檢視 viewPictures = (ViewGroup) inflater.inflate(R.layout.viewpagers, null); viewPager = (ViewPager) viewPictures.findViewById(R.id.guidePagers); viewPoints = (ViewGroup) viewPictures.findViewById(R.id.viewPoints); // 新增小圓點導航的圖片 for (int i = 0; i < pageViews.size(); i++) { imageView = new ImageView(WhatsnewPagesA.this); imageView.setLayoutParams(new LayoutParams(20, 20)); imageView.setPadding(5, 0, 5, 0); // 吧小圓點放進陣列中 imageViews[i] = imageView; // 預設選中的是第一張圖片,此時第一個小圓點是選中狀態,其他不是 if (i == 0) imageViews[i].setImageDrawable(getResources().getDrawable( R.drawable.page_indicator_focused)); else imageViews[i].setImageDrawable(getResources().getDrawable( R.drawable.page_indicator_unfocused)); // 將imageviews新增到小圓點檢視組 viewPoints.addView(imageViews[i]); } setContentView(viewPictures); viewPager.setAdapter(new NavigationPageAdapter()); // 為viewpager新增監聽,當view發生變化時的響應 viewPager.setOnPageChangeListener(new NavigationPageChangeListener()); }
三、改進的一種處理方式:
專案架構如下:
下面我們就採用自定義View的方式,把圓點導航指示器的顯示程式碼,放到自定義檢視(RoundNavigationIndicator)中
RoundNavigationIndicator.java檔案如下:
package edu.njupt.javer.roundnavigationindicator.view; import edu.njupt.javer.roundnavigationindicator.R; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.LinearLayout; /** * @author yixiang *自定義圓點導航指示器 */ public class RoundNavigationIndicator extends LinearLayout { private LinearLayout container; private int sum=0; private int selected=0; private Context context; public RoundNavigationIndicator(Context context) { super(context); this.context=context; init(context); } public RoundNavigationIndicator(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; init(context); } private void init(Context context) { LayoutInflater.from(context).inflate(R.layout.image_navigation_indicaor_layout, this); setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER_VERTICAL); container=(LinearLayout) findViewById(R.id.indicator); } //設定圓點總數 public void setLenght(int sum){ this.sum=sum; } //設定選中圓點的下標 public void setSelected(int selected){ container.removeAllViews(); this.selected=selected; } //繪製指示器 public void draw(){ for(int i=0;i<sum;i++){ ImageView imageview=new ImageView(context); imageview.setLayoutParams(new LayoutParams(20, 20)); imageview.setPadding(5, 0, 5, 0); if(i==selected){ imageview.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); }else{ imageview.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); } container.addView(imageview); } } }
然後我們在佈局檔案中(activity_main.xml)匯入我們的自定義檢視(RoundNavigationIndicator),方法如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/dark" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent"/> <edu.njupt.javer.roundnavigationindicator.view.RoundNavigationIndicator android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/indicator" android:layout_marginBottom="20dp" android:layout_gravity="bottom|center_horizontal" /> </FrameLayout>
最後我們要在activity中對自定義檢視(RoundNavigationIndicator)設定其自定義屬性。
程式碼如下:
package edu.njupt.javer.roundnavigationindicator;
import edu.njupt.javer.roundnavigationindicator.view.RoundNavigationIndicator;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
public class MainActivity extends Activity {
private int[] imageUrls={R.drawable.mm1,R.drawable.mm2,R.drawable.mm3,R.drawable.mm4};
private RoundNavigationIndicator indicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化圓點導航指示器
indicator=(RoundNavigationIndicator) findViewById(R.id.indicator);
indicator.setLenght(imageUrls.length);
indicator.setSelected(0);
indicator.draw();
ViewPager pager=(ViewPager) findViewById(R.id.pager);
pager.setAdapter(new MyPagerAdapter());
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
//根據viewpager的改變修正圓點導航指示器
indicator.setSelected(position);
indicator.draw();
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
class MyPagerAdapter extends PagerAdapter{
private LayoutInflater inflater;
public MyPagerAdapter() {
inflater=LayoutInflater.from(getApplicationContext());
}
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0.equals(arg1);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View imageLayout = inflater.inflate(R.layout.item_pager_image, container, false);
ImageView imageview=(ImageView) imageLayout.findViewById(R.id.image);
imageview.setImageResource(imageUrls[position]);
container.addView(imageLayout);
return imageLayout;
}
}
}
四、Demo下載地址
相關推薦
Android開發實戰2----圓點導航指示器(使用自定義View實現)
一、專案概述 當我們使用viewpager進行圖片預覽時,底部一般情況都會出現圓點導航指示器,效果如圖所示: 二、不好的一種處理方式: 剛開始的情況下,我們會現在activity中先定義一個LinearLayout,然後對於這個LinearLayout進行增刪Imag
android 開發第五彈---水波紋與自定義view實現絢麗粒子
1.首先我們來看下效果: 要實現上面的效果,首先我們自定義一個myWare繼承自VIew,重寫它的三個構造方法; public class MyWare extends View { pr
Android開發之漫漫長途 番外篇——自定義View的各種姿勢2
是個 pub water 常用 getchild mod one 它的 sdn 該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷
瀑布流(自定義佈局實現)
這篇文章主要分享如何用自定義佈局來實現瀑布流,關於瀑布流的其他實現方式可以參考我的另一篇文章 瀑布流(UIScrollView實現),利用UICollectionView實現瀑布流有個非常大的好處就是我們不用關心重用機制,只把注重點放在如何自定義佈局來排布每一個
Android開發——打造簡單的Viewpager指示器(小圓點指示器)
ges 其它 tar contex 但是 state 定義 效果 布局 準備工作: 1.兩張不同顏色的小圓點圖片,可以去阿裏巴巴矢量圖網站搜索 我把我使用的圖片貼出來 2.一個簡單的Viewpager的實現 下面是簡單的Viewpager實現步驟:
Android開發實戰之——ProgressDialog的使用(一)
ProgressDialog的使用 Android原生的ProgressDialog分為兩類 1. 一類是進度條不明確的 2. 另一類是進度條明確的 展示的形式有圓形和水平進度條 注意:對於不明確的進度條才可以設定Indeterminate為tru
Android開發:使用者註冊登入模組(客戶端+服務端)
1. 前言: 為了方便,將註冊頁面和登入頁面也在一塊。演示: 2.資料庫搭建:MySQL create database test; use test; create table user( user_id int primary key auto_
Android 人們口中的sdcard和android開發中的sdcard的區別(自理解)
現在的android手機很多都不支援在手機上再插一張sdcard了,就是那種上面印著多少GB的小黑卡,我查了很多資料發現,手機自帶的記憶體(其中分為兩部分:系統所佔記憶體 + 手機除去系統所佔記憶體剩餘的記憶體,其中“手機除去系統所佔記憶體剩餘的記憶體”被安卓預設為:手機自帶
android 開發中常用的第三方庫(圖片載入篇——Glide)
目錄 目錄 1. 簡介 介紹:Glide,是Android中一個圖片載入開源庫Google的開源專案 主要作用:實現圖片載入 2. 功能特點 2.1 功能列表 功能列表 從上面可以看出,Glide不僅實現了圖片非同步載入的功能,還解決了Android中載入圖片時需要解決的一些常見問題 接下來,我會對
ASP.NET WebApi OWIN 實現 OAuth 2.0(自定義獲取 Token)
href timespan 獲取 edi prot cep b- med 2-0 相關文章:ASP.NET WebApi OWIN 實現 OAuth 2.0 之前的項目實現,Token 放在請求頭的 Headers 裏面,類似於這樣: Accept: application
Android應用--簡 美音樂播放器獲取專輯圖片(自定義列表介面卡)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
android柱狀圖(自定義view)
public class HistogramView extends View { private Paint mLinePaint; private Paint mGreenPaint; private Paint mTextPaint;
移動開發----Android模仿打字機效果的自定義View實現
前言 在做splash介面的時候,需要做類似於打字機打字的效果,字一個一個地蹦出來,顯示每一個字都帶有打字的聲音。 效果演示 實現原理: 這個其實不難實現,通過一個定時器不斷呼叫TextView的setText就行了,在setTex
小程式開發的一些經驗(自定義picker元件)
最近這段時間接了一個小程式的開發,開發了一段時間,總結一些經驗,與大家交流下。 1.小程式的頭部title,可以在json裡配置,也可以動態修改。 2.微信小程式連續點選跳轉頁面會跳轉多個頁面,可以加個公共方法,可以加在util.js裡,比如: let button
Android中Spinner下拉列表(使用ArrayAdapter和自定義Adapter實現)
今天學習了Spinner元件,使用Spinner相當於從下拉列表中選擇專案,下面演示一下Spinner的使用(分別使用ArrayAdapter和自定義Adapter實現) (一):使用Arr
【Python實戰】機型自動化標註(搜狗爬蟲實現)
1. 引言 從安卓手機收集上來的機型大都為這樣: mi|5 mi|4c mi 4c 2014022 kiw-al10 nem-tl00h 收集的機型大都雜亂無章,不便於做統計分析。因此,標註顯得尤為重要。 中關村線上有對國內大部分手機的介紹情況,包括手機機型nem-tl00h及其對應的常見名稱榮耀暢玩5C
android 屬性動畫(view普通使用 和 自定義view使用)
1、概述 普通的動畫主要是Animation 和 Animator(與5.0的切換動畫,介面共享元素動畫區分開) Animation 分 TranslateAnimation 移動 scaleAnimation 縮放 RotateAnimation 旋轉 AlphaA
重力感應,圖片擺動旋轉(自定義控制元件) android
自定義ImageView控制元件,根據重力感應,圖片左右搖擺(只是類似於搖一搖的簡單Demo。真機測試,不要用虛擬機器,虛擬機器沒有重力感應。會有抖動現象,因為重力感應一直在變,可以參考下http://download.csdn.net/deta
【Android Studio】 AS 使用記錄04(自定義打包apk名)
Android Studio打包應用預設生成的apk名稱是:app-release.apk 、 如果我們要讓生成的apk名跟我們版本包名有聯絡,那我們就要自定義生成的apk名了, 在其Model b
android底部導航欄+viewPager+自定義view的簡單實現
Ps:導航欄直接用Android Design Library,導航欄的話用TabLayout實現,是比較方便快捷的方法。以下僅供初學者學習。。。。一年後回過來看寫的比較糟糕 1首先我們要解決介面的問題,也就是先讓使用者能看到介面,再來搞定能不能用的問題是