欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > Android实现图片旋转效果-自定义ViewPager控件

Android实现图片旋转效果-自定义ViewPager控件

日期:2023-10-02 16:51

-->
1。问题概述

   使用ViewPager控件可以实现水平翻页、水平切换图片等效果。不过ViewPager需要手动滑动来切换页面。图片轮显示效果的作用本质上是基于ViewPager控件实现自动切换。所以实现图片旋转的步骤如下:

1。扩展 ViewPager 自定义一个 MyScrollImageView 类

2。为MyScrollImageView定义适配器并加载图像信息

3。定义图片滑动动画时间控制类

   接下来我们一步步实现下面的例子:

2。实施例程

1。为自定义ViewPager控件编写适配器

  我们首先为自定义ViewPager控件编写一个适配器来加载要旋转的图片。这和使用ViewPager控件为适配器控件定义适配器是一样的

//适配器
公共类 MyPagerAdapter 扩展 PagerAdapter {
私有活动 mActivity; // 上下文
私有列表 mListViews; // 图片组
公共 MyPagerAdapter(){
}
公共MyPagerAdapter(活动mActivity,列表mListViews){
this.mActivity=mActivity;
this.mListViews=mListViews;
}
公共 int getCount() {
if (mListViews.size() == 1) {//一张图片不需要流动
return mListViews.size();
}
返回 Integer.MAX_VALUE;
}
/**
返回List中的图片元素并加载到控件中
*/
公共对象 instantiateItem(View v, int i) {
if (((ViewPager) v).getChildCount() == mListViews.size()) {
((ViewPager) v)
.removeView(mListViews.get(i % mListViews.size()));
}
((ViewPager) v).addView(mListViews.get(i % mListViews.size()), 0);
return mListViews.get(i % mListViews.size());
} 公共布尔 isViewFromObject(视图 arg0, 对象 arg1) {
返回arg0 == (arg1);
} public void destroyItem(ViewGroup view, int i, Object object) {
view.removeView(mListViews.get(i%mListViews.size()));
} }

2。自定义一个MyScrollImageView类

  自定义一个MyScrollImageView类,主要扩展一个start(...)方法,实现按照时间间隔连续切换图片

公共类 MyImgScroll 扩展了 ViewPager {
活动mActivity; //上下文
列表 mListViews; // 图片组
int mScrollTime = 0;
定时器定时器;
int oldIndex = 0;
int curIndex = 0; 公共MyImgScroll(上下文上下文,属性集属性){
超级(上下文,属性);
} /**
* 开始广告卷轴
*
* @param mainActivity
* 显示广告的主界面
* @param imgList
* 图片列表,不能为空,至少一张
* @参数scrollTime
*滚动间隔,0表示不滚动
* @param ovalLayout
* 点容器,可以为空,LinearLayout类型
* @param ovalLayoutId
* 当ovalLayout为空时,写入0,点布局XMl
* @param ovalLayoutItemId
* 当ovalLayout为空时,写入0,点布局XMl View ID
* @param focusId
* 当ovalLayout为空时,写入0,选择点布局XMl时的动画
* @param normalId
* 当ovalLayout为空时,写入0,点布局XMl正常背景
*/
public void start(Activity mainActivity, List imgList,
int scrollTime, LinearLayout ovalLayout, int ovalLayoutId,
int ovalLayoutItemId、intfocusedId、intnormalId) {
mActivity = mainActivity;
mListViews = imgList;
mScrollTime = 滚动时间;
//设置点
setOvalLayout(ovalLayout,ovalLayoutId,ovalLayoutItemId,focusedId,
正常ID);
this.setAdapter(new MyPagerAdapter(mActivity,mListViews)); // 设置适配器
if (scrollTime != 0 && imgList.size() > 1) {
//设置滑动动画时间。如果使用默认的动画时间,则不必使用它。反射技术实现
新的FixedSpeedScroller(mActivity).setDuration(this, 700);
startTimer();
// 触摸时停止滚动
this.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
startTimer();
}其他{
stopTimer();
}
返回错误;
}
});
}
if (mListViews.size() > 1) {
this.setCurrentItem((Integer.MAX_VALUE / 2)
- (Integer.MAX_VALUE / 2) % mListViews.size());//设置选中的中间/图片与第0张图片相同
}
} //设置点
私有无效setOvalLayout(最终LinearLayout ovalLayout,int ovalLayoutId,
最终 int ovalLayoutItemId、最终 int focusId、最终 int normalId) {
if (ovalLayout != null) {
LayoutInflater inflater=LayoutInflater.from(mActivity);
for (int i = 0; i < mListViews.size(); i++) {
ovalLayout.addView(inflater.inflate(ovalLayoutId, null)); }
//选中第一个
ovalLayout.getChildAt(0).findViewById(ovalLayoutItemId)
.setBackgroundResource(focusedId);
this.setOnPageChangeListener(new OnPageChangeListener() {
公共无效onPageSelected(int i){
curIndex = i % mListViews.size();
//取消圆点选中
ovalLayout.getChildAt(oldIndex).findViewById(ovalLayoutItemId)
.setBackgroundResource(normalId);
// 圆点被选中
ovalLayout.getChildAt(curIndex).findViewById(ovalLayoutItemId)
.setBackgroundResource(focusedId);
oldIndex = curIndex;
} 公共无效onPageScrolled(int arg0,float arg1,int arg2){
} 公共无效 onPageScrollStateChanged(int arg0) {
}
});
}
}
/**
* 获取选中的下标
* @return
*/
公共 int getCurIndex() {
返回 curIndex;
}
/**
*停止滚动
*/
公共无效stopTimer(){
if (定时器!= null) {
计时器.取消();
计时器=空;
}
} /**
*开始滚动
*/
公共无效startTimer(){
计时器 = new Timer();
定时器.schedule(new TimerTask() {
公共无效运行(){
mActivity.runOnUiThread(new Runnable() {
公共无效运行(){
MyImgScroll.this.setCurrentItem(MyImgScroll.this
.getCurrentItem() + 1);//设置控件当前项(改变图片)
}
});
}
}, mScrollTime, mScrollTime);
} }

3。定义图片滑动动画时间控制类

包 com.tianshicoffeeom.app.imgscroll;
导入java.lang.reflect.Field;
导入 android.content.Context;
导入 android.support.v4.view.ViewPager;
导入 android.view.animation.Interpolator;
导入 android.widget.Scroller;
/**
* 图片滑动动画时间控制类。如果使用默认时间,则不需要此类。通过反射技术改变ViewPager的滑动时间
*
*/
公共类FixedSpeedScroller扩展Scroller {
私有Context上下文;
私有 int mDuration = 500;
公共FixedSpeedScroller(上下文上下文){
超级(上下文);
this.context=上下文;
}
公共FixedSpeedScroller(上下文上下文,插值器插值器){
super(上下文,插值器);
this.context=上下文;
}
/**
* 设置和改变ViewPager的滑动时间
* @param vp ViewPager 对象
* @参数时间时间
*/
公共无效setDuration(ViewPager vp,int时间){
尝试一下{
字段字段 = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
this.setmDuration(time);//设置翻转时间
field.set(vp, this);
} catch (异常 e) { }
}
@覆盖
公共无效startScroll(int startX,int startY,int dx,int dy,int持续时间){
//System.out.println("startScroll1");
super.startScroll(startX, startY, dx, dy, mDuration);
}
@覆盖
公共无效startScroll(int startX,int startY,int dx,int dy){
//System.out.println("startScroll2");
super.startScroll(startX, startY, dx, dy, mDuration);
}
公共无效setmDuration(int时间){
mDuration = 时间;
}
公共 int getmDuration() {
返回 mDuration;
}
}

4、编写MainActivity,组件测试

公共类 MainActivity 扩展 Activity { 私有 MyImgScroll myPager; // 图片容器
私有 LinearLayout 椭圆布局; // 圆点容器
私人列表listViews; // 图片组
@覆盖
公共无效 onCreate(捆绑保存实例状态){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myPager = (MyImgScroll) findViewById(R.id.myvp);
ovalLayout = (LinearLayout) findViewById(R.id.vb);
InitViewPager();//初始化图片
//开始滚动
myPager.start(这个, listViews, 4000, ovalLayout,
www.introzo.com_bottom_item,www.introzo.com_item_v,
www.introzo.com_focused、www.introzo.com_normal);
}
@覆盖
protected void onRestart() {
myPager.startTimer();
super.onRestart();
} @覆盖
protected void onStop() {
myPager.stopTimer();
super.onStop();
}
/**
*初始化图片
*/
私有无效 InitViewPager() {
listViews = new ArrayList();
int[] imageResId = new int[] { R.drawable.banner1, R.drawable.横幅2,
R.drawable。横幅3,R.drawable.d,R.drawable。横幅4};
for (int i = 0; i < imageResId.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {//设置图片点击事件
Toast.makeText(MainActivity.this,
“点击:”+ myPager.getCurIndex(), Toast.LENGTH_SHORT)
.show();
}
});
imageView.setImageResource(imageResId[i]);
imageView.setScaleType(www.introzo.com_CROP);
listViews.add(imageView);
}
} }

5。 MainActivity布局文件

xmlns:tools="http://www.introzo.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="垂直" >
android:id="@+id/myvp"
android:layout_width="fill_parent"
android:layout_height="120dp" />
<线性布局
android:id="@+id/vb"
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_marginTop="3dip"
机器人:重力=“中心”
android:orientation="水平" >

  结束!

作者:杰瑞教育
来源:http://www.introzo.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园所有。欢迎转载,但未经作者授权,您同意必须保留本声明,并在文章页面明显位置提供原文链接,否则保留追究法律责任的权利。 -->