Android学习笔记(二)--ViewPager的使用(轮播功能的实现)

本文介绍了一个使用ViewPager实现轮播效果的简单示例,包括MainActivity和ImagePagerAdapter的代码实现,并添加了指示器小圆点增强用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是否觉得只有几个按钮和几个View有点太单一呢,页面上怎么能只显示这么少的内容呢?没关系,ViewPager来帮忙。(听说已经过时,但还是看一下吧,总是相通的)这里是参考了《第一行代码》一书。
先上代码。

MainActivity.java

package com.example.viewpagertry;

import android.app.Activity;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewPager pager=new ViewPager(this);
        pager.setAdapter(new ImagePagerAdapter(this));
        setContentView(pager);
    }
}

ImagePagerAdapter.java

package com.example.viewpagertry;

import android.content.Context;
import android.graphics.Color;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ImagePagerAdapter extends PagerAdapter {
    private Context mcontext;
    private static final int[] IMAGES={
            android.R.drawable.ic_menu_camera,
            android.R.drawable.ic_menu_add,
            android.R.drawable.ic_menu_delete,
            android.R.drawable.ic_menu_share,
            android.R.drawable.ic_menu_edit
    };
    private static final int[] COLORS={
            Color.RED,Color.BLUE,Color.GREEN,Color.GRAY,Color.MAGENTA
    };
    private static final String[] Content={
            "aa","bb","cc","dd","ee"
    };
    public ImagePagerAdapter(Context context){
        super();
        mcontext=context;
    }
    @Override
    public int getCount(){
        return IMAGES.length;
    }
    @Override
    public float getPageWidth(int position){
        return 1f;
    }
    @Override
    public Object instantiateItem(ViewGroup container,int position) {
        ImageView imageView = new ImageView(mcontext);
        imageView.setImageResource(IMAGES[position]);
        imageView.setBackgroundColor(COLORS[position]);
        TextView textView=new TextView(mcontext);
        textView.setText(Content[position]);
        container.addView(imageView);
        return imageView;
    }
    @Override
    public void destroyItem(ViewGroup container,int position,Object object){
        container.removeView((View) object);
    }
    @Override
    public boolean isViewFromObject(View view,Object object){
        return (view==object);
    }
}

刚入门的同学可能觉得Adapter这个东西有点虚无缥缈,其实就是一个适配器,用来告诉.xml什么位置该显示什么内容,扩展性强,太自由就是它的难点吧。如上的代码运行起来就是一个可以左右滑动的页面了,我这里吗只是设计了几张简单的图片和背景颜色,必须通过手动滑动来查看页面,如果想要更复杂的都可通过自定义来实现,继续向下看。这样翻页的效果如果再 配上一个Timer 和setCurrentiem就可以完成了一个轮播,就想淘宝和各种新闻客户端上的一样,循环显示信息。但是总感觉少了点什么,后来一番思考,又做了个小圆点,随着滑动,来变化。想法比较粗糙,可能效率也不太高,以后想到了再来更新。
附完整代码。
更改后的完整的activity如下。adapter还是上面的那个,没有进行更改。

package com.example.viewpagertry;

import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {
    private Handler handler;
    private Thread thread;
    private ViewPager viewPager;
    private LinearLayout ll_dot;
    private Context context;
    private int s=0;
    List<ImageView> dots = new ArrayList<ImageView>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context=this;
        viewPager=(ViewPager)findViewById(R.id.viewpager);
        ImagePagerAdapter adapter=new ImagePagerAdapter(context);
        ll_dot = (LinearLayout) findViewById(R.id.ll_dot);
        viewPager.setAdapter(adapter);
        initdot(s);
        thread=new Thread(){
            public void run(){
                while (true){
                    try {
                        Thread.sleep(3000);   //等待轮播  3秒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Message.obtain(handler,0,"").sendToTarget();
                }
            }
        };
        thread.start();
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 0:
                        int i=viewPager.getCurrentItem();
                        if (i==4){
                            viewPager.setCurrentItem(0);
                            initdot(0);
                        }else{
                            i++;
                            viewPager.setCurrentItem(i);
                            initdot(i);
                        }
                        break;
                    default:
                        break;
                }
            }
        };
    }
    private void initdot(int k) {
        ll_dot.removeAllViews();
        for (int i = 0; i <5; i++) {
            ImageView img = new ImageView(this); 
            if (i == k) {
                img.setImageResource(R.drawable.point_checked);
            } else {
                img.setImageResource(R.drawable.point_normal);
            }
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(50, 50);
            params.setMargins(5, 0, 5, 5);
            // 加载到布局容器
            ll_dot.addView(img, params);
            dots.add(img);
        }

    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                thread.stop();
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                thread.start();
                break;
        }
        return super.onTouchEvent(ev);
    }
}

里面用的两个drawable
point_checked

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners android:radius="8dp" />
    <solid android:color="#fff" >
    </solid>
</shape>

point_normal

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners android:radius="8dp" />
    <solid android:color="#fff" >
    </solid>
</shape>

中间的Activity我重写了一个触摸事件,就是要在手动更改Viewpager的时候,让负责轮播的线程停下来,否则还会继续轮播,达不到想要的效果。绘图是一项很重要的技能,发现自己很薄弱,还需改正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值