android 中间大两边小,android 画廊效果(中间大两边小)的无限轮播banner「建议收藏」

android 中间大两边小,android 画廊效果(中间大两边小)的无限轮播banner「建议收藏」android画廊效果(中间大两边小)的无限轮播bannerps:项目要求做一个中间大两边小的轮播图,百度了一圈有了些灵感,分享一下心得,国际惯例先上效果图banner.gif废话不多说,直接上关键代码:/***Createdbytfon2018/12/21.*/importandroid.content.Context;importandroid.os.Handler;impo…

大家好,又见面了,我是你们的朋友全栈君。

android 画廊效果(中间大两边小)的无限轮播banner

ps: 项目要求做一个中间大两边小的轮播图,百度了一圈有了些灵感,分享一下心得,国际惯例先上效果图

74830b692933

banner.gif

废话不多说,直接上关键代码:

/**

* Created by tf on 2018/12/21.

*/

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.view.WindowManager;

import android.view.animation.Interpolator;

import android.widget.Scroller;

import android.widget.TextView;

import com.hexin.cardservice.R;

import java.lang.ref.WeakReference;

import java.lang.reflect.Field;

import java.util.List;

import java.util.concurrent.atomic.AtomicBoolean;

public class LoopViewPager extends ViewPager {

OnPageChangeListener mOuterPageChangeListener;

private LoopPagerAdapterWrapper mAdapter;

private MyHandler mHandler;

private final static int HANDLE_LOOP_MSG = 101;

private AtomicBoolean isAutoLoop = new AtomicBoolean();

public void setTxtPoints(List txtPoints) {

this.txtPoints = txtPoints;

}

private List txtPoints;

public void changePoints(int pos) {

if (txtPoints != null) {

for (int i = 0; i < txtPoints.size(); i++) {

if (pos == i) {

txtPoints.get(i).setBackgroundResource(R.mipmap.home_yuan_sel);

} else {

txtPoints.get(i).setBackgroundResource(R.mipmap.home_yuan);

}

}

}

}

@Override

public void setAdapter(PagerAdapter adapter) {

mAdapter = new LoopPagerAdapterWrapper(adapter);

super.setAdapter(mAdapter);

isAutoLoop.set(false);

setCurrentItem(0, false);

}

@Override

public PagerAdapter getAdapter() {

return mAdapter != null ? mAdapter.getRealAdapter() : mAdapter;

}

/**

* 获取当前真实的item

*

* @return

*/

public int getRealItem() {

return mAdapter != null ? mAdapter.toRealPosition(super.getCurrentItem()) : 0;

}

public void setCurrentItem(int item, boolean smoothScroll) {

int realItem = mAdapter.toInnerPosition(item);

super.setCurrentItem(realItem, smoothScroll);

}

@Override

public void setOnPageChangeListener(OnPageChangeListener listener) {

mOuterPageChangeListener = listener;

}

public LoopViewPager(Context context) {

super(context);

init();

}

public LoopViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

super.setOnPageChangeListener(onPageChangeListener);

try {

Field scrollerField = ViewPager.class.getDeclaredField(“mScroller”);

scrollerField.setAccessible(true);

Field interpolator = ViewPager.class.getDeclaredField(“sInterpolator”);

interpolator.setAccessible(true);

Scroller scroller = new Scroller(getContext(), (Interpolator) interpolator.get(null)) {

@Override

public void startScroll(int startX, int startY, int dx, int dy, int duration) {

//控制滑动速度

super.startScroll(startX, startY, dx, dy, (int) (1300 * (double) Math.abs(dx) / getWidth(getContext())));

}

};

scrollerField.set(this, scroller);

} catch (Exception e) {

e.printStackTrace();

}

}

public void autoLoop(boolean isAuto) {

if (mHandler == null) {

mHandler = new MyHandler(getContext());

}

if (isAuto) {

mHandler.sendEmptyMessageDelayed(HANDLE_LOOP_MSG, 3000);

} else {

mHandler.removeCallbacksAndMessages(null);

}

isAutoLoop.set(isAuto);

}

private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {

private float mPreviousOffset = -1;

private float mPreviousPosition = -1;

@Override

public void onPageSelected(int position) {

int realPosition = mAdapter.toRealPosition(position);

changePoints(realPosition);

if (mPreviousPosition != realPosition) {

mPreviousPosition = realPosition;

if (mOuterPageChangeListener != null) {

mOuterPageChangeListener.onPageSelected(realPosition);

}

}

}

@Override

public void onPageScrolled(int position, float positionOffset,

int positionOffsetPixels) {

int realPosition = position;

if (mAdapter != null) {

realPosition = mAdapter.toRealPosition(position);

if (positionOffset == 0

&& mPreviousOffset == 0

&& (position == 0 || position == mAdapter.getCount() – 1)) {

setCurrentItem(realPosition, false);

}

}

mPreviousOffset = positionOffset;

if (mOuterPageChangeListener != null) {

if (realPosition != mAdapter.getRealCount() – 1) {

mOuterPageChangeListener.onPageScrolled(realPosition,

positionOffset, positionOffsetPixels);

} else {

if (positionOffset > .5) {

mOuterPageChangeListener.onPageScrolled(0, 0, 0);

} else {

mOuterPageChangeListener.onPageScrolled(realPosition,

0, 0);

}

}

}

}

@Override

public void onPageScrollStateChanged(int state) {

switch (state) {

case SCROLL_STATE_DRAGGING:

if (isAutoLoop.get()) {

mHandler.removeCallbacksAndMessages(null);

}

break;

case SCROLL_STATE_IDLE:

if (isAutoLoop.get()) {

mHandler.sendEmptyMessageDelayed(HANDLE_LOOP_MSG, 3000);

}

break;

case SCROLL_STATE_SETTLING:

break;

}

if (mOuterPageChangeListener != null) {

mOuterPageChangeListener.onPageScrollStateChanged(state);

}

}

};

// @Override

// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

//

// int height = 0;

// for (int i = 0; i < getChildCount(); i++) {

// View child = getChildAt(i);

// child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

// int h = child.getMeasuredHeight();

// if (h > height)

// height = h;

// }

// int width = 0;

// for (int i = 0; i < getChildCount(); i++) {

// View child = getChildAt(i);

// child.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), heightMeasureSpec);

// int h = child.getMeasuredWidth();

// if (h > width)

// width = h;

// }

//

// heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

// widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);

//

// super.onMeasure(widthMeasureSpec, heightMeasureSpec);

// }

private class MyHandler extends Handler {

WeakReference mWeakReference;

public MyHandler(Context context) {

mWeakReference = new WeakReference<>(context);

}

@Override

public void handleMessage(Message msg) {

final Context context = mWeakReference.get();

if (context == null) {

return;

}

switch (msg.what) {

case HANDLE_LOOP_MSG:

int curItem = getCurrentItem();

setCurrentItem(++curItem);

changePoints(curItem % txtPoints.size() );

break;

}

}

}

public int getWidth(Context context) {

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics outMetrics = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(outMetrics);

return outMetrics.widthPixels;

}

}

LoopPagerAdapterWrapper类

package com.hexin.cardservice.ui.customView;

/**

* Created by 15061 on 2018/12/21.

*/

import android.os.Parcelable;

import android.support.v4.view.PagerAdapter;

import android.view.View;

import android.view.ViewGroup;

public class LoopPagerAdapterWrapper extends PagerAdapter {

private PagerAdapter mAdapter;

LoopPagerAdapterWrapper(PagerAdapter adapter) {

this.mAdapter = adapter;

}

@Override

public void notifyDataSetChanged() {

super.notifyDataSetChanged();

}

public int toInnerPosition(int realPosition) {

return realPosition + getCount() / 2 – getCount() % getRealCount();

}

int toRealPosition(int position) {

return position % getRealCount();

}

@Override

public int getCount() {

return Integer.MAX_VALUE;

}

public int getRealCount() {

return mAdapter.getCount();

}

public PagerAdapter getRealAdapter() {

return mAdapter;

}

@Override

public Object instantiateItem(ViewGroup container, int position) {

int realPosition = position % getRealCount();

return mAdapter.instantiateItem(container, realPosition);

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

int realPosition = position % getRealCount();

mAdapter.destroyItem(container, realPosition, object);

}

@Override

public void finishUpdate(ViewGroup container) {

mAdapter.finishUpdate(container);

}

@Override

public boolean isViewFromObject(View view, Object object) {

return mAdapter.isViewFromObject(view, object);

}

@Override

public void restoreState(Parcelable bundle, ClassLoader classLoader) {

mAdapter.restoreState(bundle, classLoader);

}

@Override

public Parcelable saveState() {

return mAdapter.saveState();

}

@Override

public void startUpdate(ViewGroup container) {

mAdapter.startUpdate(container);

}

@Override

public void setPrimaryItem(ViewGroup container, int position, Object object) {

mAdapter.setPrimaryItem(container, position, object);

}

}

配置文件代码

android:id=”@+id/relativelayout”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”15dp”>

<.loopviewpager>

android:id=”@+id/myviewpager”

android:layout_width=”match_parent”

android:layout_height=”125dp” />

android:id=”@+id/layout_dots”

android:layout_width=”wrap_content”

android:layout_height=”30dp”

android:layout_alignParentBottom=”true”

android:layout_centerHorizontal=”true”

android:gravity=”center”

android:orientation=”horizontal”/>

MainActivity 应用

初始化ViewPager

private void initViewPager() {

mViewpager = view.findViewById(R.id.myviewpager);

//图片圆角处理

for (int i = 0; i < mBannerArr.length; i++) {

ImageView view1 = new ImageView(getContext());

RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), BitmapFactory.decodeResource(getResources(), mBannerArr[i]));

//view1.setImageResource(R.mipmap.pic);

roundedBitmapDrawable.setCornerRadius(30);

view1.setImageDrawable(roundedBitmapDrawable);

mImageList.add(view1);

}

mViewpager.setClipChildren(false);

DisplayMetrics dm = getResources().getDisplayMetrics();

mViewpager.setPageMargin(-dm.widthPixels / 13);//设置viewpage之间的间距

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mViewpager.getLayoutParams();

//高度根据图片进行适配(这里图片为750 *300)

params.height = (int) (getResources().getDisplayMetrics().widthPixels * 330 / 750.0);

params.width = getResources().getDisplayMetrics().widthPixels;

mViewpager.setLayoutParams(params);

mViewpager.setAdapter(new MyAdapter());

mViewpager.setPageTransformer(true, new ViewPager.PageTransformer() {

float scale = 0.85f;

@Override

public void transformPage(View page, float position) {

if (position >= 0 && position <= 1) {

page.setScaleY(scale + (1 – scale) * (1 – position));

} else if (position > -1 && position < 0) {

page.setScaleY(1 + (1 – scale) * position);

} else {

page.setScaleY(scale);

}

}

});

mViewpager.autoLoop(true);

}

初始化指示器小圆点

/**

* 初始化小圆点

*/

private void initCircle() {

mLayoutPoints = view.findViewById(R.id.layout_dots);

mTxtPoints = new ArrayList<>();

int d = DensityUtils.dp2px(mContext, 6);

int m = 10;

for (int i = 0; i < mImageList.size(); i++) {

TextView txt = new TextView(getContext());

if (i == 0) {

txt.setBackgroundResource(R.mipmap.home_yuan_sel);

} else {

txt.setBackgroundResource(R.mipmap.home_yuan);

}

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(d, d);

params.setMargins(m, m, m, m);

txt.setLayoutParams(params);

mTxtPoints.add(txt);

mLayoutPoints.addView(txt);

}

mViewpager.setTxtPoints(mTxtPoints);

}

viewpager自定义适配器:

class MyAdapter extends PagerAdapter {

@Override

public int getCount() {

return mImageList.size();

}

@Override

public boolean isViewFromObject(View view, Object object) {

return view == object;

}

@Override

public Object instantiateItem(ViewGroup container, final int position) {

ImageView view = mImageList.get(position);

ViewParent viewParent = view.getParent();

if (viewParent == null) {

container.addView(view);

}

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

log.d(TAG, “点击了第” + postion + “张图”);

}

});

return view;

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView((View) object);

}

}

PS:这些就是轮播效果图了,希望对读者有帮助。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142000.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 各代iphone尺寸_iPhone每一代的屏幕尺寸比例是多少?[通俗易懂]

    各代iphone尺寸_iPhone每一代的屏幕尺寸比例是多少?[通俗易懂]展开全部第一代iPhone2G屏幕为32313133353236313431303231363533e78988e69d83313333663037663.5英吋,分辨率为320*480像素,比例为3:2。第二代iPhone3G屏幕为3.5英吋,分辨率为320*480像素,比例为3:2。第三代iPhone3GS屏幕为3.5英吋,分辨率为320*480像素,比例为3:2。第四代iPhone4屏幕为3…

  • 用户名为中文软件不能用_电脑用户名打不了中文

    用户名为中文软件不能用_电脑用户名打不了中文(软件必须要求路径和用户名都是英文,比如SystemVue和MATLAB)我安装matlab也是一路坎坷,一开始每次激活成功后就自动关闭,再次打开依旧提示激活,无论是在线激活还是本地选择license文件都不行(.lic文件是从Mathwork上登录后下载下来的)。讲道理是还有一年期限,不会过期的,但是试了好久启动不了。后来发现license文件放错了位置,应该放在安装目录下,如C:\Progr…

    2022年10月14日
  • docker安装Redis_docker redis配置文件路径

    docker安装Redis_docker redis配置文件路径1、获取redis镜像dockerpullredis

    2022年10月29日
  • 100道Go语言面试题

    100道Go语言面试题多选题1.【初级】下面属于关键字的是()A.funcB.defC.structD.class参考答案:AC2.【初级】定义一个包内全局字符串变量,下面语法正确的是()A.varstrstringB.str:=””C.str=””D.varstr=””参考答案:AD3.【初级】通过指针变量p访问其成员变量name,下面语法正确的是()A.p.nameB.(*p).nameC.(&…

  • MyEclipse10 安装SVN插件及SVN插件在MyEclipse10下使用方法

    MyEclipse10 安装SVN插件及SVN插件在MyEclipse10下使用方法在安装MyEclipse10的SVN插件之前,首先得搞清Subversion、Subclipse、Ankhsvn与tortoiseSvn之间的关系。Subversion是一个服务器,主要有VisualSvnSer、Subversion+Apache,其中VisualSvnSer包含了Subversion+Apache,配置很方便,主要是VisualStudio开发管理代码用,Subclips

  • 视频直播技术_直播如何实现低延迟

    视频直播技术_直播如何实现低延迟借《让子弹飞》中姜文的名言作为开场白:让子弹飞一会儿。某名人吐槽说:还要飞一会儿哪?这子弹的延迟也忒大了。 该名人就是鄙人。为什么低延迟很重要?低延迟的子弹可以击杀敌军千米之外,低延迟的直播技术可以秒杀粉丝千里之外。互动直播技术已经成为直播平台的标配。没有互动直播技术的直播平台无法跻身直播行业第一梯队。而要获得互动直播技术,实现低延迟

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号