1. 程式人生 > >Android---自定義ViewPager指示器(一)

Android---自定義ViewPager指示器(一)

 最近學習了怎麼自己畫Viewpager指示器的形狀。
  1. 新建立一個ViewPagerIndicator類 繼承自LinearLayout

    • 初始化Paint例項

    在它的含有兩個引數的構造方法內初始化要畫的圖形所需要的工具,例如:我們要畫一個三角形。首先我們要有一個paint類例項上程式碼:

 public ViewPagerIndicator(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setAntiAlias(true
); //@ parseColor // * Parse the color string, and return the corresponding color-int. mPaint.setColor(Color.parseColor("#FFFFFFFF")); mPaint.setStyle(Paint.Style.FILL); mPaint.setPathEffect(new CornerPathEffect(3));
  • 覆寫onSizeChanged(int w, int h, int oldw, int oldh)這個方法會在View 的大小發生變化的時候呼叫,所以在這裡設定三角形的長和寬並且初始化三角形。

    mTriangleWidth = (int) (w / mTabVisibleCount *                  RADIO_TRIANGLE);
    mTriangleHeight = mTriangleWidth / 2;
    
    mInitTanslateX = w / 2 / mTabVisibleCount - mTriangleWidth / 2;
    
    initTriangle();
    
  • 畫三角形的時候要用到path

 mPath = new Path();
        //@param x The x-coordinate of the start of a new contou(新輪廓)
        mPath.moveTo(0
, 0); mPath.lineTo(mTriangleWidth, 0); mPath.lineTo(mTriangleWidth / 2, -mTriangleHeight); mPath.close();

-覆寫ondispatch方法。在這個方法裡繪製三角形

@Override
    protected void dispatchDraw(Canvas canvas) {

        canvas.save();

        //畫筆的起點位置
        canvas.translate(mInitTanslateX + mTranslateX, getHeight());

        canvas.drawPath(mPath, mPaint);

        canvas.restore();

        super.dispatchDraw(canvas);
        Log.d(TAG, "dispatchDraw: ");
    }

這樣三角形的畫出來了,但是現在這個三角形還不可以跟隨頁面滑動而動。

2.實現指示器跟隨手指聯動

需要addOnPageChangeListener,內部new 一個ViewPager.OnPageChangeListener(),在它的onpageScrolled這個回撥方法裡寫怎麼跟隨手指移動的方法,如下:

int tabWidth = getWidth() / mTabVisibleCount;
        mTranslateX = (int) (tabWidth * (position + positionOffset));
        //tabwidth 跟著一起聯動
        if (position >=mTabVisibleCount - 2 && positionOffset > 0 &&
                getChildCount() > mTabVisibleCount) {
            if (mTabVisibleCount != 1) {
                //隱藏的position
                int hidTabCount = position - (mTabVisibleCount - 2);
                this.scrollTo(
                        (hidTabCount * tabWidth + (int) (tabWidth * positionOffset)), 0);
            } else {
                this.scrollTo((position * tabWidth + (int) (tabWidth * positionOffset)), 0);

            }

        }
        invalidate();

3.實現tab高亮顯示和點選事件

首先寫好一個設定tab文字高亮的方法,然後將其加到 onPageSelected內,意思是,到當前頁被選中時,tab文字變高亮。
點選時間在建立tab的時候呼叫。這個新增到自動建立tab 的方法內,和載入完xml檔案後的方法內(這個在下篇文章中詳細講).
private void highLightTextView(int position){
        resetTextViewColor();
        View view = getChildAt(position);

        if (view instanceof TextView){
            ((TextView) view).setTextColor(TEXT_COLOR_LIGHT);
        }

private void setTabOnclick() {
        int size = getChildCount();
        for (int i = 0; i < size; i++) {
            View view = getChildAt(i);
            final int j = i;
            if (view instanceof TextView) {
                view.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mViewPager.setCurrentItem(j);
                    }
                });
            }
        }
    }

相關推薦

Android---定義ViewPager指示器

最近學習了怎麼自己畫Viewpager指示器的形狀。 新建立一個ViewPagerIndicator類 繼承自LinearLayout 初始化Paint例項 在它的含有兩個引數的構造方法內初始化要畫的圖形所需要的工具,例如:我們要畫一個三角形。首先我

android--------定義控件

有時 價值 ondraw 自己實現 IE viewgroup 實現 沒有 com 在我們平常的Android開發中經常和控件打交道,有時Android提供的控件未必能滿足業務的需求,這個時候就需要我們實現自定義一些控件 自定義控件可以設計出很多你想要的功能和模塊,在開發中是

Android定義相機Camera

Time:2018/06/21  因為專案需求,需要實現跟小猿搜題的類似的功能,系統相機直接就被排除了,原本打算是找個一個demo,改吧改吧就直接用了,找的過程中發現程式碼太舊了,目前6.0以上的系統很多不支援,然後按照demo的邏輯,就寫一個相

Android定義View總結基礎知識與例項

自定義View是最能體現一個Android開發者水平的技能之一了。 接下來的一些列部落格將總結一下Android的自定義相關View知識,包括View的結構,事件體系,工作原理,自定義View的繪製等。 參考資料部分來自於書上以及各種部落格。 新建了一個qq群 482

Android定義圖表庫:圓形進度圖

效果預覽 自定義View第一步:確認View的大小 無論是自定義一個View還是ViewGroup我們必須得先為其制定在不同MeasureSpecMode下的大小,我這裡就不講解什麼繪製原始碼了什麼的,我們就直接實戰。 我們在onMeasure中需要呼叫se

android定義View學習----建立一個檢視類

建立一個檢視類 精心設計的自定義檢視與其他精心設計的類非常相似。它使用易於使用的介面封裝了一組特定的功能,它可以高效地使用CPU和記憶體,等等。不過,作為一個設計良好的班級,自定義檢視應該: 符合Android標準 提供適用於Android XML佈局的自

Android定義控制元件 下拉重新整理,上拉分頁載入更多(支援ListView, GridView, ScrollView)

        首先說明,這幾篇文章是對一些前輩的成果進行學習後的心得總結。也借這種方式對他們表示謝意。         最近專案中好幾個模組都用到listview和gridview的下拉重新整理,上拉載入更多等功能,而且涉及到圖片的批量下載。水平有限,首先是想到找一些比較

android定義view學習之時尚錶盤

最近在學習自定義view,順便謝謝自己的路程,後面回首看看以前的自己有多菜。。。。下方的是實現圖,首先需要說明的是,這個效果是看了一遍部落格,然後自己想著去實現,並給出此部落格:點選開啟連結正文:首先學習自定義view需要稍稍入門一下,然後是各種函式的使用,以及大量的練習,至

Android定義控制元件系列二:定義開關按鈕

這一次我們將會實現一個完整純粹的自定義控制元件,而不是像之前的組合控制元件一樣,拿系統的控制元件來實現;計劃分為三部分:自定義控制元件的基本部分,和自定義控制元件的自定義屬性; 下面就開始第一部分的編寫,本次以一個定義的開關按鈕為例,下面就開始吧: 先看看效果,一個點選開

按鈕配置之定義按鈕使用——JEPLUS軟件快速開發平臺

事件 proc oss In 需求 信息 ces otto 圖片 JEPLUS按鈕配置之自定義按鈕使用(一)系統開發過程中無論是表單的默認按鈕或是列表的默認按鈕以及Action的默認按鈕有時候並不能滿足我們的業務需求,這個時

DispNet中Caffe定義層解讀—— CustomData

DispNet中Caffe自定義層解讀(一)—— CustomData 這一系列博文記錄了博主在學習DispNet過程中遇到的自定義Caffe層的筆記。這一部分是CustomData層,其主要功能是:讀取資料庫中的LMDB型別資料,並將其隨機排布後存入top。更新於2018.10.2

WPF定義控制元件の控制元件分類

原文: WPF自定義控制元件(一)の控制元件分類 一、什麼是控制元件(Controls)         控制元件是指對資料和方法的封裝。控制元件可以有自己的屬性和方法,其中屬性是控制元件資料的簡單訪問者,方法則是控制元件的一些簡單而可見的功能、控制元件建

java定義註解學習_demo小練習

自定義註解 現在大家開發過程中,經常會用到註解。 比如@Controller 等等,但是有時候也會碰到自定義註解,在開發中公司的記錄日誌就用到了自定義註解。身為渣渣猿還是有必要學習下自定義註解的。 這篇我們先寫一個簡單的註解列子,不會立馬介紹各種什麼元註解。從例子中感受下註解的作用 定義個註解 packa

定義Gradle外掛

Google已經建議Android開發全部轉向Android Studio開發,Android Studio 是使用gradle編譯、打包的,那麼問題來了,gradle可是有一堆東西...,為了測底瞭解gradle,今天就來學習下如何寫自己的gradle外掛(當然外掛原

Android定義View初探——仿360垃圾清理

明天就是五一勞動節了,在這裡先祝各位程式猿勞動節快樂,別在加班了! 自從嘗試過寫自定義View(Android自定義View初探(一)——餅圖)之後,每當看到別人的應用時,總是在想別人的實現方式,或許,這就是程式猿的悲哀吧O(∩_∩)O~。 前兩天就想嘗試去

Unity Personal Android定義啟動介面Splash

mUnityPlayer = new UnityPlayer(this); ivSplash=new ImageView(this); ivBg=new ImageView(this); ivBg.setBackgroundColor(

Android定義ViewPager指示器

自我感覺ViewPager+fragment在Android中挺重要的,自己還不太明白 ViewPagerIndicator的思路: 先在佈局最上面載入一張黑色圖片,作為標籤的背景 然後將剩餘部分全都置為VIewPager,用來滑動。高度為0dp,用lay

Android定義控制元件-給定義控制元件新增事件

在這篇部落格中主要講解給Android自定義控制元件新增點選事件,實現可以按住百分比圓圈在螢幕上進行拖動圓圈的功能。分兩部分講,第一部分是獲取自定義控制元件的座標,第二部分是重新繪製控制元件。 第一部分:獲取自定義控制元件座標 首先看一張圖,這是自定義控制元件中獲

JavaWeb學習心得之定義簡單標籤

一、簡單標籤簡介 含義:實現SimpleTag介面的標籤稱為簡單標籤。 方法: setJspContext:用於把JSP頁面的pageContext物件傳遞給標籤處理器物件setParent:用於把

Android 定義數字鍵盤定義輸入框

Android 自定義數字鍵盤(一) Android 自定義數字鍵盤(二)隨機數字 Demo地址:https://github.com/danfengfirst/KeyDemo 這篇部落格是在上面兩篇部落格的基礎上修改的一個相對比較完整的demo,