1. 程式人生 > >Android開發實戰2----圓點導航指示器(使用自定義View實現)

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首先我們要解決介面的問題,也就是先讓使用者能看到介面,再來搞定能不能用的問題是