Android實現(xiàn)實時滑動ViewPager的2種方式
先看看效果圖:

activity_main.xml
<RelativeLayout 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" tools:context="com.example.welcome.MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/mViewPager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" > <com.example.welcome.PagerCursor android:id="@+id/pagerCursor" android:layout_width="fill_parent" android:layout_height="5dp" /> </FrameLayout> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="30dp" > <com.example.welcome.CustomeDotGroup android:id="@+id/ll_point_group" android:layout_width="fill_parent" android:layout_height="10dp" android:orientation="horizontal" > </com.example.welcome.CustomeDotGroup> <View android:id="@+id/red_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/point_red" /> </FrameLayout> </RelativeLayout>
MainActivity
package com.example.welcome;
import java.util.ArrayList;
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.view.View;
import android.view.ViewGroup;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ViewPager mViewPager;
MyAdapter mAdapter;
private ArrayList<ImageView> imageViewList;
View red_point;
private int lastDis;
PagerCursor pagerCursor;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pagerCursor = (PagerCursor) findViewById(R.id.pagerCursor);
red_point = findViewById(R.id.red_point);
imageViewList = new ArrayList<ImageView>();
int[] imagesInt = {R.drawable.p1,R.drawable.p2,R.drawable.p3};
for (int i = 0; i < imagesInt.length; i++) {
ImageView imageView = new ImageView(MainActivity.this);
imageView.setBackgroundResource(imagesInt[i]);
imageViewList.add(imageView);
}
mViewPager = (ViewPager) findViewById(R.id.mViewPager);
mAdapter = new MyAdapter();
mViewPager.setAdapter(mAdapter);
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
private boolean isDragging;
@Override
public void onPageSelected(int arg0) {
}
@Override
public void onPageScrolled(int position, float screenOffSet, int arg2) {
TranslateAnimation animation = null;
if (isDragging) {
int dp2px = PhoneUtils.dp2px(MainActivity.this, 20f);
int offSet = (int) (position*dp2px + dp2px*screenOffSet);
animation = new TranslateAnimation(lastDis, offSet, 0f, 0f);
animation.setDuration(200);
animation.setFillAfter(true);
red_point.startAnimation(animation);
lastDis = offSet;
}
float[] screenSize = MeasureUtil.getScreenSize(MainActivity.this);
float itemWidth = screenSize[0]/3;
pagerCursor.SetOffSet(position,screenOffSet,itemWidth);
}
@Override
public void onPageScrollStateChanged(int arg0) {
switch (arg0) {
case ViewPager.SCROLL_STATE_DRAGGING://滑動
isDragging = true;
break;
case ViewPager.SCROLL_STATE_IDLE://空閑
isDragging = false;
break;
default:
break;
}
}
});
}
class MyAdapter extends PagerAdapter{
@Override
public int getCount() {
return imageViewList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(imageViewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(imageViewList.get(position));
return imageViewList.get(position);
}
}
}
CustomeDotGroup
package com.example.welcome;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class CustomeDotGroup extends LinearLayout {
private Context context;
public CustomeDotGroup(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
initRes();
}
public CustomeDotGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomeDotGroup(Context context) {
this(context, null);
}
private void initRes() {
int dotWidthOrHeight = PhoneUtils.dp2px(context, 10);
for (int i = 0; i < 3; i++) {
ImageView dotImageView = new ImageView(context);
dotImageView.setBackgroundResource(R.drawable.point_normal);
LayoutParams dotImageViewParams = new LayoutParams(dotWidthOrHeight, dotWidthOrHeight);
if (i != 0) {
dotImageViewParams.leftMargin = dotWidthOrHeight;
}
dotImageView.setLayoutParams(dotImageViewParams);
this.addView(dotImageView);
}
}
}
PagerCursor
package com.example.welcome;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class PagerCursor extends View {
Context context;
private Paint mPaint;
private int screenWidth;
private int desRight;
private float itemWidth;
public PagerCursor(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public PagerCursor(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initRes();
// TODO Auto-generated constructor stub
}
public PagerCursor(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
private void initRes() {
float[] screenSize = MeasureUtil.getScreenSize((Activity) context);
screenWidth = (int) screenSize[0];
Log.d("TAG", ",screenWidth" + screenWidth);
mPaint = new Paint();
mPaint.setColor(getResources().getColor(R.color.contentPressColor));
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
}
public void SetOffSet(int position, float screenOffSet, float itemWidth) {
int offSet = (int) (position * itemWidth + itemWidth * screenOffSet);
this.itemWidth = itemWidth;
desRight = offSet;
Log.d("TAG", "screenOffSet:" + screenOffSet + ",position" + position
+ ",desRigh-->t" + desRight + ",itemWidth" + itemWidth);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.d("TAG", "onDraw,desRigh-->t" + desRight + ",itemWidth" + itemWidth);
canvas.drawRect(desRight, 0f, desRight + itemWidth,
PhoneUtils.dp2px(context, 5), mPaint);
}
}
MeasureUtil
package com.example.welcome;
import android.app.Activity;
import android.util.DisplayMetrics;
/**
* 測繪工具�?
*/
public final class MeasureUtil {
/**
* 獲取屏幕尺寸
*
* @param activity
* Activity
* @return 屏幕尺寸像素值,下標(biāo)�?的�?為寬,下標(biāo)為1的�?為高
*/
public static float[] getScreenSize(Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
return new float[] { metrics.widthPixels, metrics.heightPixels };
}
}
PhoneUtils
package com.example.welcome;
import android.content.Context;
public class PhoneUtils {
public static int dp2px(Context context,float dpValue){
float scale = context.getResources().getDisplayMetrics().density;
return (int)(dpValue * scale +0.5f);
}
}
源碼下載:http://xiazai.jb51.net/201610/yuanma/androidviewpaper(jb51.net).rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中用RxJava和ViewPager實現(xiàn)輪播圖
- Android開發(fā)基于ViewPager+GridView實現(xiàn)仿大眾點評橫向滑動功能
- Android ViewPager實現(xiàn)圖片輪播效果
- Android使用ViewPager實現(xiàn)無限滑動效果
- Android開發(fā)實戰(zhàn)之漂亮的ViewPager引導(dǎo)頁
- Android 使用ViewPager實現(xiàn)圖片左右循環(huán)滑動自動播放
- android 通過向viewpage中添加listview來完成滑動效果(類似于qq滑動界面)
- Android利用ViewPager實現(xiàn)滑動廣告板實例源碼
- Android ViewPager相冊橫向移動的實現(xiàn)方法
- android配合viewpager實現(xiàn)可滑動的標(biāo)簽欄示例分享
- Android viewpage實現(xiàn)禁止滑動的功能
相關(guān)文章
房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計詳解及實例
這篇文章主要介紹了房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計詳解及實例的相關(guān)資料,需要的朋友可以參考下2017-03-03
在Android Studio中Parcelable插件的簡單使用教程
下面小編就為大家分享一篇在Android Studio中Parcelable插件的簡單使用教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
Android自定義ViewGroup實現(xiàn)標(biāo)簽流效果
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup實現(xiàn)標(biāo)簽流效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06

