1. 程式人生 > >Android 之 分分鐘打造XViewPagerIndicator指示器

Android 之 分分鐘打造XViewPagerIndicator指示器

直接上程式碼:

import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import
android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; /** * * @author 作者:易皇星 * * @da2016年9月27日 時間: * * @toTODO 類描述: */ public class XViewPagerIndicator
extends LinearLayout {
private static final String TAG = "ViewPagerIndicator"; private Context context; private ViewPager mViewPager; private int COLOR_TEXT_NORMAL = 0xFF000000; private int COLOR_INDICATOR_COLOR = Color.RED; private String[] mTitles; // private int mTabCount; private
float mTranslationX; private Paint mPaint = new Paint(); private int mTabWidth; private List<TextView> textViews = new ArrayList<TextView>(); // 裝載TextView文字,用來切換字型顏色 public XViewPagerIndicator(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.context = context; mPaint.setColor(COLOR_INDICATOR_COLOR); mPaint.setStrokeWidth(9.0f); } public XViewPagerIndicator(Context context) { super(context); // TODO Auto-generated constructor stub this.context = context; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // TODO Auto-generated method stub super.onSizeChanged(w, h, oldw, oldh); mTabWidth = w / mTabCount; } /** * * @param indicatorColor 統一設定自己想要的顏色字型 */ public void setIndicatorColor(int indicatorColor) { this.COLOR_INDICATOR_COLOR = indicatorColor; if(null!=mPaint){ mPaint.setColor(indicatorColor); } } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); canvas.save(); canvas.translate(mTranslationX, getHeight() - 2); canvas.drawLine(0, 0, mTabWidth, 0, mPaint); canvas.restore(); } public void scroll(int position, float offset) { mTranslationX = getWidth() / mTabCount * (position + offset); invalidate(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); } /** * * @param titles * 當前ViewPagerIndicator 顯示的內容 * @param viewPager * 當前viewPager */ public void setTitles(String[] titles, ViewPager viewPager) { mTitles = titles; this.mViewPager = viewPager; mTabCount = titles.length; generateTitleView(); setViewPagerOnPageChangeListener(); } private void setViewPagerOnPageChangeListener() { if (null != mViewPager) { mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // TODO Auto-generated method stub scroll(position, positionOffset); setCurrentTextColor(position); } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } } private void generateTitleView() { // TODO Auto-generated method stub if (getChildCount() > 0) this.removeAllViews(); final int count = mTitles.length; setWeightSum(count); for (int i = 0; i < count; i++) { TextView tv = new TextView(getContext()); LayoutParams lp = new LayoutParams(0, LayoutParams.MATCH_PARENT); lp.weight = 1; tv.setGravity(Gravity.CENTER); tv.setTextColor(COLOR_TEXT_NORMAL); tv.setText(mTitles[i]); tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); tv.setLayoutParams(lp); // 事件監聽 final int currentIndex = i; tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(context, mTitles[currentIndex].toString(), // Toast.LENGTH_SHORT).show(); if (null != mViewPager) { mViewPager.setCurrentItem(currentIndex); } else { Log.i(TAG, "請初始化Viewpager"); } } }); addView(tv); textViews.add(tv); } } /** * * * @param currentIndex * 設定當前ViewPager滑動時title的顏色 */ public void setCurrentTextColor(int currentIndex) { for (int i = 0; i < mTitles.length; i++) { if (textViews.get(i).equals(textViews.get(currentIndex))) { textViews.get(currentIndex).setTextColor(COLOR_INDICATOR_COLOR); } else { textViews.get(i).setTextColor(COLOR_TEXT_NORMAL); } } } }

沒什麼可講的,一般控制元件簡單的封裝了下

2。使用:

import java.util.ArrayList;
import java.util.List;

import com.example.xviewpagerindicator.fragment.OneFragment;
import com.example.xviewpagerindicator.fragment.ThreeFragment;
import com.example.xviewpagerindicator.fragment.TwoFragment;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity {

    private XViewPagerIndicator mViewPagerindicator;
    private String[] titles = { "簡介", "評價", "相關" };
    private ViewPager viewPager;
    private List<Fragment> fragments = new ArrayList<Fragment>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragments.add(new OneFragment());
        fragments.add(new TwoFragment());
        fragments.add(new ThreeFragment());

        mViewPagerindicator = (XViewPagerIndicator) findViewById(R.id.id_stickynavlayout_indicator);
        mViewPagerindicator.setIndicatorColor(Color.BLUE);
        viewPager = (ViewPager) findViewById(R.id.id_stickynavlayout_viewpager);
        viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));

        mViewPagerindicator.setTitles(titles, viewPager);
        //      mViewPagerindicator.setIndicatorColor(Color.GRAY);


    }




    class ViewPagerAdapter extends FragmentPagerAdapter {

        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
            // TODO Auto-generated constructor stub

        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return fragments.size();
        }

        @Override
        public Fragment getItem(int arg0) {
            // TODO Auto-generated method stub
            return fragments.get(arg0);
        }

    }

}

3。main.xml

<LinearLayout 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"
    android:orientation="vertical" >

    <com.example.xviewpagerindicator.XViewPagerIndicator
        android:id="@+id/id_stickynavlayout_indicator"
        android:layout_width="match_parent"
        android:layout_height="50dp" >
    </com.example.xviewpagerindicator.XViewPagerIndicator>

    <android.support.v4.view.ViewPager
        android:id="@+id/id_stickynavlayout_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

</LinearLayout>

效果圖:
這裡寫圖片描述

相關推薦

Android 分鐘打造XViewPagerIndicator指示器

直接上程式碼: import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import

Android TabLayout 分鐘打造一個滑動標籤頁

作者:亦楓連結:https://www.jianshu.com/p/39a66373498c來源:簡書著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。使用滾動的標籤指示器和滑動的內容頁面,是手機應用經常出現的一種設計風格,常見的比較出名的應用有:微信(首頁

AndroidUI--打造12種Dialog對話框

指正 ati 整體 port login ast select log inflater 最近有空,來把app中常用到的Dialog對話框寫一篇博客,在app中很多地方都會用到Dialog對話框,今天小編我就給大家介紹Dialog對話框。 先看看效果圖:

分鐘理解大資料基礎Spark

一背景 Spark 是 2010 年由 UC Berkeley AMPLab 開源的一款 基於記憶體的分散式計算框架,2013 年被Apache 基金會接管,是當前大資料領域最為活躍的開源專案之一 Spark 在 MapReduce 計算框架的基礎上,支援計算物件資料可以直接快取到記憶體中,大大提高了整體

分鐘理解大數據基礎Spark

概念 rap http oss 結果 文件 yar 客戶 mapreduce 一背景 Spark 是 2010 年由 UC Berkeley AMPLab 開源的一款 基於內存的分布式計算框架,2013 年被Apache 基金會接管,是當前大數據領域最為活躍的開源項目之一

分鐘學會一門語言Ruby篇

# This is a comment # 這是一行註釋 =begin This is a multiline comment No-one uses them You shouldn't either 多行註釋是這樣寫的, 沒人用它,你也不要用它。 =e

Android打造自己載入高清大圖及瀑布流框架.解決錯位等問題.

    首先看效果圖如下:     本框架支援本地圖片和網路圖片的獲取.採用LruCache演算法,最少使用的最先釋放.有效的避免OOM,專案結構圖:          核心載入類在於ImageLoader.採用了TreadPool去做併發請求.UI處理採用Handler

AndroidListView頁獲取網路資料(伺服器端)(一)

資料庫分頁: mysql:select pname from product limit 0,2;第一個引數是指要開始的地方,第二個引數是指每頁顯示多少條資料;注意:第一頁用0表示。 oracle:rownumber SqlServer:top 一、伺服器端 ①新建包com

AndroidTab頁標籤的實現方法一-----可滑動的Tab的3種方式

package com.swordy.demo.android.fragment; import java.util.Random; import android.os.Bundle; import android.support.v4.app.Fragment; import android.su

AndroidTab頁標籤的實現方法一-----美化TabHost(四)

安卓預設的TabHost樣式是比較樸素的,可以對它進行樣式美化。對佈局進行美化的時候需要在佈局檔案中體現出來。TabHost標籤應由一個TabWidget和一個FrameLayout組成。其中TabWidget定義了標籤的屬性,而frameLayout定義了標籤的內容。

androidlistview頁載入上拉重新整理、更新listview

==========系統方法實現上啦重新整理=========public class GreatToolsActivity extends Activity { private TextView tv; private ListView listtest;

AndroidViewPagerIndictor三角形指示器

話不多說,上效果圖啊 根據慕課網裡面寫出來的,可以點選,也可以滑動,不過只能滑動一個 MainActivity類: package com.example.viewpagerindicator; import java.util.ArrayLis

AndroidUI--打造萬能自定義Dialog

在我們開發app的時候,很多地方需要彈出一個對話方塊,我們要不就直接用系統的Dialog或者就是AlertDialog,但是美工給我們的效果圖片很多都是無法去實現的。接下來我們來看下自定義Dialog的使用方法:首先我給大家展示2個圖片: 上面的

分鐘搞定自定義控制元件組合控制元件--自定義View入門篇

今天給大家詳細講解一下如何實現自定義組合控制元件,組合控制元件其實很簡單。大家可以自由地組合任意控制元件。好了,下面開始我們的正文。 我們要實現的效果如右圖底部所示,其實呢!大家只要把握規律,還是挺容易的。 新建一個attrs.xml屬性集檔案,即你要自定義控制元件的

轉載:ASP.NET MVC單元測試分鐘的事

一、為什麼要進行單元測試? 大部分開發者都有個習慣(包括本人在內),常常不喜歡去做單元測試。因為我們對自己寫的程式總是盲目自信,或者存在僥倖心理每次執行通過後就直接扔給測試組的妹子們了。結果妹子一測,大把大把的bug出現了,最後每每看到測試的妹子走過來,心裡就只想說一句話:

Android——AIDL深入

you widget avi net 存在 rate 優點 font 接口 轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/47071927 在上一篇博文《Android之——AIDL小結》中,我們簡介

Linux內存尋址頁機制

緩存 itl ans linux 存儲器 apt target tar linux中 http://blog.xiaohansong.com/2015/10/05/Linux內存尋址之分頁機制/ 在上一篇文章Linux內存尋址之分段機制中,我們了解邏輯地址通過分段機制轉換為

Android——多線程下載演示樣例

技術分享 style lis pad range 轉載 pre fontsize response 轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/46883927 一、概述 說到A

AndroidListView的getItemViewType和getViewTypeCount

ldr get 思路 pre 簡單 erl 他會 add item PS:感覺這兩個方法其實還是很容易理解的,也算是給我其他兩個朋友寫的吧,幫他們搞清楚這兩個方法的用法和概念。同時還有一些小細節問題需要註意。 學習內容: 1.getItemViewType和get

Android使用weight屬性實現控件的按比例分配空間

今天 text wrap 在底部 net ack 實現 sans com 從今天開始,把看書時候的知識點整理成博客,這個比較簡單,預計有經驗的都用過,weight屬性 在做Android布局的時候,常常遇到須要幾個控件按比例分配空間的情況比方下圖效果在底部設置兩個butt