1. 程式人生 > >Android自定義ViewPager指示器

Android自定義ViewPager指示器

自我感覺ViewPager+fragment在Android中挺重要的,自己還不太明白
ViewPagerIndicator的思路:

  • 先在佈局最上面載入一張黑色圖片,作為標籤的背景
  • 然後將剩餘部分全都置為VIewPager,用來滑動。高度為0dp,用layout_weight=1分配剩餘位置
    -給最上面黑色圖片所在的區域設定三個TextView(有一定的侷限性,因為基礎比較差,所以先新增三個模組)
    Note:這時的控制元件是自定義的,所以需要寫完整的包名

新增Fragment,與ViewPager聯合起來使用。可以實現滑動效果
給每一個Fragment新增內容
當ViewPager滑動時,繪製一個小三角形隨它進行移動。
繪製三角形的分析:
因為是等腰,所以從(0,0)到(寬,0)再到(寬/2,高)

佈局如下:

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context
="com.example.viewpagerzidingyi.MainActivity" android:background="#ffffff">
<com.example.viewpagerzidingyi.ViewPagerIndicator android:id="@+id/indicator" android:layout_width="match_parent" android:layout_height="45dp" android:background="@mipmap/al" android:orientation
="horizontal">
<TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="目標" android:textColor="#CCFFFFFF" android:textSize="16sp" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="計劃" android:textColor="#CCFFFFFF" android:textSize="16sp" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="努力" android:textColor="#CCFFFFFF" android:textSize="16sp" /> </com.example.viewpagerzidingyi.ViewPagerIndicator> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="0dp" android:id="@+id/viewpager" android:layout_weight="1"> </android.support.v4.view.ViewPager> </LinearLayout>

這裡寫圖片描述

package com.example.viewpagerzidingyi;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;

import com.example.viewpagerzidingyi.simpleFragment.ViewPagerSFragment;

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

public class MainActivity extends AppCompatActivity {
    private ViewPager mViewPager;
    private ViewPagerIndicator mIndicator;

    private List<String> mTitles= Arrays.asList("目標","計劃","努力");
    private List<ViewPagerSFragment> mContents=new ArrayList<ViewPagerSFragment>();
    private FragmentPagerAdapter pagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initViews();
        initDatas();

        mViewPager.setAdapter(pagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                //tabWidth偏移量   tabWidth*positionOffset +position*positionOffset
                mIndicator.scroll(position,positionOffset);
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void initDatas() {
        for (String title:mTitles){
            ViewPagerSFragment fragment=ViewPagerSFragment.newInstance(title);
            mContents.add(fragment);
        }
        pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return mContents.size();
            }

            @Override
            public Fragment getItem(int position) {
                return mContents.get(position);
            }
        };

    }

    private void initViews() {
        mViewPager= (ViewPager) findViewById(R.id.viewpager);
        mIndicator= (ViewPagerIndicator) findViewById(R.id.indicator);
    }
}
package com.example.viewpagerzidingyi.simpleFragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Created by 杜春慧 on 2016/5/21.
 */
public class ViewPagerSFragment extends Fragment {
    //需要一個引數指明它的title
    public String mTitle;
    public static final String BUNDLE_TITLE = "title";



    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,  ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = getArguments();

        if (bundle != null) {
            mTitle = bundle.getString(BUNDLE_TITLE);
        }

        TextView mTextView = new TextView(getActivity());
        mTextView.setText(mTitle);
        mTextView.setGravity(Gravity.CENTER);
        return mTextView;

    }

    public static ViewPagerSFragment newInstance(String title) {
        Bundle bundle = new Bundle();
        bundle.putString(BUNDLE_TITLE, title);

        ViewPagerSFragment fragment = new ViewPagerSFragment();
        fragment.setArguments(bundle);
        return fragment;
    }





}

package com.example.viewpagerzidingyi;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.LinearLayout;

/**
* Created by on 2016/5/21.
*/
public class ViewPagerIndicator extends LinearLayout {
//自定義的控制元件繼承源生控制元件,重寫四個方法
//自定義導航

private Paint mPaint;

//可以通過path構造三角形
private Path mPath;
//三角形框和高
private int mTriangleWidth;
private int mTriangleHeight;
//每一個三角形的底和每一個Tab是一樣的
private static final float RADIO_TRIANGLE_WIDTH=1/7F;
private int mInitTranslationX;
private int mTranslationX=0;

public ViewPagerIndicator(Context context) {
    this(context,null);

}

public ViewPagerIndicator(Context context, AttributeSet attrs) {
    super(context, attrs);
    //初始化畫筆
    mPaint=new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(Color.parseColor("#ffffffff"));
    mPaint.setStyle(Paint.Style.FILL);
    //設定三角形不要太尖銳
    mPaint.setPathEffect(new CornerPathEffect(3));

}



//繪製三角形
@Override
protected void onDraw(Canvas canvas) {
    //在平移之前先儲存
    canvas.save();
    canvas.translate(mInitTranslationX+mTranslationX,getHeight()+8);
    canvas.drawPath(mPath,mPaint);

    canvas.restore();

    super.onDraw(canvas);
}

//設定三角形大小  適用於知道控制元件寬高來設定
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    mTriangleWidth = (int) (w / 3  *RADIO_TRIANGLE_WIDTH);
   //三角形偏移量
    mInitTranslationX = w / 3 /2 - mTriangleWidth /2;


    initTriangle();
}

//初始化三角形
private void initTriangle() {
mTriangleHeight = mTriangleWidth /2;
mPath = new Path();
mPath.moveTo(0,0);
mPath.lineTo(mTriangleWidth,0);
mPath.lineTo(mTriangleWidth/2,-mTriangleWidth);
mPath.close();
}
//三角形指示器跟隨手指移動
public void scroll(int position, float offset) {
int tabWidth = getWidth() / 3;
mTranslationX= (int) (tabWidth*(offset + position));
//重繪,呼叫該方法
invalidate();
}
}
最終結果如下:
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

相關推薦

Android定義ViewPager指示器

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

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

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

Android定義Viewpager指示器PagerIndicator-仿微博頭條效果

平時工作之餘,喜歡看看新聞,手機難免會裝了幾個新聞閱讀類的app。新聞類的app風格大致一致,可以選擇不同欄目,欄目可以切換。最近就在用微博頭條,感覺介面挺清新的。而且它使用的PagerIndicator挺好看的。昨晚居然準時下班了,趁著早就實現了下。今天

Android從零開搞系列:定義View(4)基本的定義ViewPager指示器+開源專案分析(上)

基本的自定義ViewPager的指示器 當然關於ViewPager指示器,如果只需要簡潔大方,那麼我們最簡單的方案就是使用TabLayout+ViewPager。 當然咱們也有很多非常不錯的開源框架可以選擇。 本次的記錄的內容就是

Android 定義 ViewPager 打造千變萬化的圖片切換效果

                記得第一次見到ViewPager這個控制元件,瞬間愛不釋手,做東西的主介面通通ViewPager,以及圖片切換也拋棄了ImageSwitch之類的,開始讓ViewPager來做。時間長了,ViewPager的切換效果覺得枯燥,形成了審美疲勞~~我們需要改變,今天教大家如何改變V

Android 定義ViewPager的滑動切換頁面效果

先借用網上圖片效果 自定義效果最重要的一個方法就是 viewPager.setPageTransformer(boolean,PageTransformer) 這個方法就是設定viewpager的滑動效果的方法,裡面需要傳遞兩個引數:第一個引數傳true就行了

Android定義StepView指示器

按照規矩先上圖 問:為什麼寫這個自定義View呢? 答:工作讓我成長。 Android關於自定義View的文章不再新鮮,實現方式也是各有千秋,在這裡自己寫的一個進度指示器實現方式是通過繼承自View實現,內部所有的圓圈、線條和文字都是直接

Android UI之定義頭部指示器

1. 簡介  本文將記錄的是一些有效的自定義指示器demo,誠然Indicator的開源框架還是比較多的,我們在具體具體中可以衡量。一些簡單的自定義基礎還是有必要好好掌握的。 2. demo樣例 2.1 圖片背景選擇+ViewPager樣式 首先看下效果吧: 如下圖

Android定義TabLayout指示器長度

效果圖: MainActivity.java檔案 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(@Nullabl

Android定義View完美實現指示器位置隨進度變化的IndicateProgressView

該文章同步釋出在公眾號”LinminTech”上,請在本文最後掃碼關注,獲取更多精彩Android開發文章。 效果圖 需求 在平時開發過程中,UI經常要求實現如上圖所示的ProgressBar,但是Android系統自帶的ProgressBar

Android 定義控制元件之ViewPager Indicator實現方式

介紹 ViewPager 的Indicator實現兩種效果 如下圖所示: 效果一 效果二 佈局檔案: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmln

Android 定義可自動擴大縮小的ViewPager

前些天看到蘑菇街的主頁上有一個效果 左右滑動照片,控制元件可以隨著照片的大小放大縮小 於是就自己試著實現了以下 我是使用ViewPager實現的 在其基礎上進行了簡單的改造。 程式碼如下: public class ScaleViewP

Android-通過定義ViewPager(中間放大效果)

/**稀土掘金,時光不老**/ 大家好,很早就想寫部落格了,一是工作忙,二是缺乏原創性,三當然是自己的能力不夠啦,寫這篇部落格是很惶恐。。。。請多多包涵 /**************************** --------   ---------          

Android定義控制元件:將ViewPager封裝自己的TabPager控制元件

用途 最近專案頁面中經常出現諸如下圖的控制元件,如果為每個頁面分別寫一個將會造成非常多的重複程式碼,不利於專案的閱讀和維護,也會使專案變得非常凌亂。所以,對於這種情況我們可以進行一定的抽取,傳入相關資料後自動顯示到控制元件上。

Android 輪播圖 實現 一 :三方框架 定義viewPager (CircleViewPager.)實現無限輪播。

使用流程:1  。 gradle中新增依賴compile 'com.zhpan.library:viewpager:1.0.3'2.在xml檔案中新增如下程式碼:<com.zhpan.viewpager.view.CircleViewPager andr

Android 定義控件之繼承ViewGroup創建新容器

多個 osi count() arc ron min ole tro 定位 歡迎大家來學習本節內容,前幾節我們已經學習了其他幾種自定義控件,分別是Andriod 自定義控件之音頻條及 Andriod 自定義控件之創建可以復用的組合控件還沒有學習的同學請先去學習下,因為本節將

Android定義相機超詳細講解

了解 catch 實現 4.4 required form 需要 eset 自己 Android自定義相機超詳細講解 轉載請標明出處: http://blog.csdn.net/vinicolor/article/details/49642861; 由於網上關於Andr

Android 定義View

wid declare created odi lex getwidth 實現 tdi led   最近在看鴻洋大神的博客,在看到自定義部分View部分時,想到之前案子中經常會要用到"圖片 + 文字"這類控件,如下圖所示: 之前的做法是在布局文件中,將一個Imag

Android 定義控件之 日期選擇控件

gin pri 選中 att files ger bottom null count() 效果如下: 調用的代碼: @OnClick(R.id.btn0) public void btn0() { final AlertDialog dialog

android 定義控件之簡單的loading框

void stroke color mat pri htm img 溫習 時機   好吧,久不動android,感覺自己已經快是條鹹魚了,趁著這周的開發任務已完成,下周的開發計劃未下來之際,來溫習一下android的自定義控件,於是就有了下面這個醜陋的玩意      實現起