Android利用ViewPager實(shí)現(xiàn)帶小圓球的圖片滑動(dòng)
在上文實(shí)現(xiàn)的帶小圓球的圖片滑動(dòng)的通用性較好,但是較復(fù)雜。
現(xiàn)在也是利用 ViewPager ,但是卻沒(méi)有利用 ShapeDrawable 來(lái)實(shí)現(xiàn)帶小圓球的圖片滑動(dòng)。如有些播放器一樣,在開(kāi)始安裝 app 時(shí),都會(huì)出現(xiàn)引導(dǎo)界面,然后才進(jìn)入主界面,但是在重新啟動(dòng) app 時(shí)卻不會(huì)再出現(xiàn)該引導(dǎo)界面。
下面實(shí)現(xiàn)的就是該類似的功能,只是把引導(dǎo)界面都做成了圖片顯示,這樣更能夠體現(xiàn)不同的做法(和上一篇博客)。
本例主要主要:在小圓點(diǎn)的繪制和 viewpager 相關(guān)聯(lián)起來(lái)。
如下效果:

MyPagerAdapter主要用于創(chuàng)建適配器;
MyPagerAdapter.java :
package com.android.circleforimage;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
public class MyPagerAdapter extends FragmentPagerAdapter {
private static Activity activity;
private static final int[] IMAGES = { R.drawable.x01, R.drawable.x02,
R.drawable.x03, R.drawable.x04, R.drawable.x05 };
public static int sum = IMAGES.length;
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
/**
* 為了獲得 MainActivity 中的 activity
*/
public void setForActivity(Activity activity) {
this.activity = activity;
}
public Activity getForActivity() {
return activity;
}
@Override
public int getCount() {
return IMAGES.length;
}
@Override
public Fragment getItem(final int position) {
return MyFragment.newInstance(position);
}
public static class MyFragment extends Fragment {
private int mBaseIndex;
// 使用工廠模式創(chuàng)建 Fragment
static MyFragment newInstance(int baseIndex) {
MyFragment fragment = new MyFragment();
fragment.setBaseIndex(baseIndex);
return fragment;
}
public MyFragment() {
super();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 最后一張圖片上有 button 按鈕
if (getBaseIndex() == IMAGES.length - 1) {
return initForButton(inflater);
} else {
return showImages(inflater);
}
}
/**
* 在全局列表中保存一個(gè)索引,記錄頁(yè)面開(kāi)始的地方
*/
public void setBaseIndex(int index) {
mBaseIndex = index;
}
/**
* 在全局列表中檢索索引,可以找到頁(yè)面開(kāi)始的地方
*/
public int getBaseIndex() {
return mBaseIndex;
}
public View initForButton(LayoutInflater inflater){
View view = inflater.inflate(R.layout.item_two, null);
Button button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(activity,
SecondActivity.class);
startActivity(intent);
activity.finish();
}
});
return view;
}
public View showImages(LayoutInflater inflater){
View view = inflater.inflate(R.layout.item_one, null);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
imageView.setImageResource(IMAGES[getBaseIndex()]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
return view;
}
}
}
Circle 類主要用于繪制小圓球:
Circle.java :
package com.android.circleforimage;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class Circle extends View {
private Paint paint;
private int radius = 16;
// 頁(yè)數(shù)和小圓球的數(shù)量相等
private int count = MyPagerAdapter.sum;
// 被選中的位置
private int choosePosition = 0;
// 兩個(gè)小圓之間的中心距
private int gap = 70;
/**
* 共外部的類調(diào)用
*/
public void choose(int pos) {
choosePosition = pos;
// 通知重繪
this.invalidate();
}
public Circle(Context context) {
this(context, null);
}
public Circle(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public Circle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint();
paint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
// 居中顯示時(shí),小圓球的起始位置
int startPx = (width - (count - 1) * gap) / 2;
for (int i = 0; i < count; i++) {
if (choosePosition == i) {
paint.setColor(Color.RED);
canvas.drawCircle(startPx + i * gap, height - 50, radius + 4,
paint);
} else {
paint.setColor(Color.WHITE);
canvas.drawCircle(startPx + i * gap, height - 50, radius, paint);
}
}
}
}
MainActivity.java :
package com.android.circleforimage;
import com.android.circleforimageutils.Words;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
private MyPagerAdapter mAdapter;
private Circle circle;
private Activity activity = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initActivity();
setContentView(R.layout.activity_main);
activity = this;
showForSecondActivity();
viewPager = (ViewPager) findViewById(R.id.viewPager);
circle = (Circle) findViewById(R.id.circle);
scrollPager();
mAdapter = new MyPagerAdapter(getSupportFragmentManager());
/* 調(diào)用 MyPagerAdapter 的方法*/
mAdapter.setForActivity(activity);
viewPager.setAdapter(mAdapter);
}
/**
* 對(duì)界面的處理
*/
private void initActivity() {
// 去標(biāo)題
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
/**
* 第一次安裝啟動(dòng)時(shí),會(huì)加載開(kāi)始的頁(yè)面,第二次啟動(dòng)時(shí),會(huì)跳過(guò)加載頁(yè)面
*/
private void showForSecondActivity() {
// PreferenceManager:Used to help create Preference hierarchies from activities or XML.
SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = mSharedPreferences.edit();
boolean b = mSharedPreferences.getBoolean(Words.KEY_ONE, true);
if (b) {
editor.putBoolean(Words.KEY_ONE, false);
editor.commit();
} else {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
finish();
}
}
/**
* viewPager 滾動(dòng)時(shí),提示 Circle 類重繪
*/
private void scrollPager() {
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
circle.choose(position);
}
});
}
}
另外新建一個(gè)常量類 Words,用于存放存量,不在一個(gè)包中;
Words.java :
package com.android.circleforimageutils;
public class Words {
public static String KEY_ONE = "key_for_main";
}
SecondActivity.java :
package com.android.circleforimage;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("歡迎來(lái)到我的博客:\n http://blog.csdn.net/antimage08");
textView.setTextSize(25);
textView.setTextColor(Color.BLUE);
textView.setGravity(Gravity.CENTER);
setContentView(textView);
}
}
activity_main.xml (一般情況下,有 viewpager 和其他占界面較少的組件一起時(shí),效果和本例相似時(shí),可以選用 FrameLayout):
<FrameLayout 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.android.circleforimage.MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.android.circleforimage.Circle android:id="@+id/circle" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>
item_one.xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
item_two.xml (ImageView 中 src 指定的是用于在有 button 按鈕時(shí)有圖片顯示才加載的,在代碼中沒(méi)有添加有 button 按鈕界面時(shí)的圖片) :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/x05"/> <Button android:id="@+id/button" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="點(diǎn)擊進(jìn)入" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
最后不能忘了在 AndroidManifest.xml 中為 SecondActivity 注冊(cè),最好在剛剛建好該類時(shí)就注冊(cè),這樣不易遺忘:
<activity android:name=".SecondActivity" />
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用ViewPager完成app引導(dǎo)頁(yè)
- Android ViewPager實(shí)現(xiàn)滑動(dòng)指示條功能
- Android使用viewpager實(shí)現(xiàn)畫(huà)廊式效果
- android使用ViewPager實(shí)現(xiàn)圖片自動(dòng)切換
- Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的方法詳解
- android使用viewpager計(jì)算偏移量實(shí)現(xiàn)選項(xiàng)卡功能
- Android使用ViewPager快速切換Fragment時(shí)卡頓的優(yōu)化方案
- Android Studio使用ViewPager+Fragment實(shí)現(xiàn)滑動(dòng)菜單Tab效果
- Android 兩個(gè)ViewPager的聯(lián)動(dòng)效果的實(shí)現(xiàn)
- Android自定義ViewPager實(shí)現(xiàn)縱向滑動(dòng)翻頁(yè)效果
- 深入了解ViewPager2的使用
相關(guān)文章
Android中EditText和AutoCompleteTextView設(shè)置文字選中顏色方法
這篇文章主要介紹了Android中EditText和AutoCompleteTextView設(shè)置文字選中顏色方法,本文給出了效果圖和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01
Android LeakCanary檢測(cè)內(nèi)存泄露原理
這篇文章主要介紹了分析LeakCanary檢測(cè)內(nèi)存泄露原理,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-03-03
Android開(kāi)發(fā)之資源目錄assets與res/raw的區(qū)別分析
這篇文章主要介紹了Android開(kāi)發(fā)之資源目錄assets與res/raw的區(qū)別,結(jié)合實(shí)例形式分析了Android開(kāi)發(fā)中資源目錄assets與res/raw的具體功能、使用方法與區(qū)別,需要的朋友可以參考下2016-01-01
Android開(kāi)發(fā)中的ViewModel使用實(shí)戰(zhàn)案例
在Android應(yīng)用開(kāi)發(fā)中,ViewModel作為架構(gòu)組件,重要的功能是管理UI數(shù)據(jù)與生命周期,文章深入分析ViewModel如何感知View的生命周期,以及其核心優(yōu)勢(shì),包括生命周期感知、數(shù)據(jù)持久化和與UI層解耦,幫助開(kāi)發(fā)者利用ViewModel優(yōu)化應(yīng)用架構(gòu),需要的朋友可以參考下2024-10-10
Android實(shí)現(xiàn)長(zhǎng)圖文截圖功能實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)長(zhǎng)圖文截圖功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Android優(yōu)化之電量?jī)?yōu)化的實(shí)現(xiàn)
這篇文章主要介紹了Android優(yōu)化之電量?jī)?yōu)化的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

