使用ViewPager实现左右循环滑动图片1

本文介绍了一种在Android应用中实现图片轮播与导航指示器的方法。通过使用ViewPager组件展示图片,并配合LinearLayout来实现底部导航小圆点的动态更新。文章详细展示了如何通过线程加载远程图片资源,并将其展示在界面上。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="100dip"
    android:orientation="vertical" >
    
    <!-- 实现图片横向滑动组件声明 -->
    <android.support.v4.view.ViewPager
        android:id="@+id/imagePages"
        android:layout_width="fill_parent"
        android:layout_height="100dip" />


    <!-- 用于存放导航小圆点 -->
    <LinearLayout
        android:id="@+id/pointGroup"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
         android:layout_marginTop="95dip"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >
    </LinearLayout>


</RelativeLayout>


代码:


package com.foess.frame;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;




import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;


public class NetMainActivity extends Activity {
// 用于装载4个图片布局View
private ArrayList<View> imgViews;


// 声明main布局对象,对应main.xml
private View main;


// 声明滑动图片显示区域ViewPager
private ViewPager viewPager;


// 声明导航显示区域,因为要装载多个小圆点,所以声明为ViewGroup
private ViewGroup pointGroup;


// 声明ImageView[],有多少图片,就应该有对应的导航小圆点view,这些view都放在这个数组中
private ImageView[] pointViews;


// 具体一个小圆点
private ImageView imageView;

// 模拟图片网络路径,正常情况下,这些路径可以通过远程加载方式获取.现在固定路径简单测试
private String[] paths = {"http://10.25.126.51:8080/web/img/a01.png",
                 "http://10.25.126.51:8080/web/img/a02.png",
                 "http://10.25.126.51:8080/web/img/a03.png",
                 "http://10.25.126.51:8080/web/img/a04.png"};


File f;
String ALBUM_PATH=Environment.getExternalStorageDirectory()+"/fsdnb/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

f = new File(Environment.getExternalStorageDirectory()+"/fsdnb/");
if(!f.exists()){
f.mkdir();
}

        // 1. no_title设置,目的图片填充整个页面
requestWindowFeature(Window.FEATURE_NO_TITLE);

   // 2. 启动线程用于加载远程图片
new LoadImageThread().start();



}

class LoadImageThread extends Thread{
@Override
public void run() {
//3. 获取LayoutInflater,目的是方便后面得到xml布局文件进行装配
LayoutInflater inflater = getLayoutInflater(); 

//4. 创建图片view存储集合
imgViews = new ArrayList<View>();






//5. 通过网络方式下载4个图片,并最终放在集合中
for(int i = 0 ; i < paths.length ; i++){
ImageView iv = new ImageView(NetMainActivity.this);
Bitmap bitmap =
getHttpBitmap(paths[i],String.valueOf(i)+".jpg");
//从网上取图片
iv .setImageBitmap(bitmap);
imgViews.add(iv);
}


//6. 获取main.xml layout对象,他是装配其他图片布局的中心点
//   要记得,它里面声明了一个图片区域ViewPager,以及一个导航指示区域
main = (View)inflater.inflate(R.layout.main,null);

//7. 通过main layout对象获取图片区域ViewPager
viewPager = (ViewPager)main.findViewById(R.id.imagePages);  
//8. 通过main layout对象获取导航指示区域
pointGroup = (ViewGroup)main.findViewById(R.id.pointGroup);  

//9. 下面开始控制导航小圆点,有多少张img,就要做多大的小圆点数组
pointViews = new ImageView[imgViews.size()];  

//10. 根据图片集合的长度决定创建多少小圆点ImageView 
for (int i = 0; i < imgViews.size(); i++) {  
           imageView = new ImageView(NetMainActivity.this);  
           imageView.setLayoutParams(new LayoutParams(20,20));  
           imageView.setPadding(20, 0, 20, 0);  
           pointViews[i] = imageView;  
           
           if (i == 0) {  
               //默认选中第一张图片,加入焦点
            pointViews[i].setBackgroundResource(R.drawable.page_indicator_focused);  
           } else {  
            pointViews[i].setBackgroundResource(R.drawable.page_indicator);  
           }  
           // 把每一个导航小圆点都加入到ViewGroup中
           pointGroup.addView(pointViews[i]);  

       }  

handler.sendEmptyMessage(0); //表示下载完毕.
}
}
// 指定保存的路径:
public void saveFile(Bitmap bm, String fileName) throws IOException {

File myCaptureFile = new File(ALBUM_PATH + fileName);
System.out.println("PATH:"+ALBUM_PATH + fileName);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
}
public Bitmap getHttpBitmap(String url,String a) {


File ff=new File(ALBUM_PATH+a);
if(ff.exists())
{
try {
return(getImageDrawable(ALBUM_PATH+a));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}else
{
try{
URL m = new URL(url);
InputStream i = (InputStream) m.getContent();
DataInputStream in = new DataInputStream(i);
FileOutputStream out = new FileOutputStream(ff);
byte[] buffer = new byte[1024];
int   byteread=0;
while ((byteread = in.read(buffer)) != -1) {
out.write(buffer, 0, byteread);
}
in.close();
out.close();
}catch(Exception e){
System.out.println("err:"+e.getMessage());
}

Bitmap bitmap=null;
try
{
URL ur = new URL(url);
InputStream is = ur.openStream();
bitmap = BitmapFactory.decodeStream(is);
//saveFile(bitmap, a);
is.close();
}catch(Exception e)
{

}
return bitmap;

}


}


//=============================================
public Bitmap getImageDrawable(String path)  
       throws IOException  
   {  
       //打开文件  
       File file = new File(path);  
       if(!file.exists())  
       {  
           return null;  
       }  
         
       ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
       byte[] bt = new byte[1024];  
         
       //得到文件的输入流  
       InputStream in = new FileInputStream(file);  
         
       //将文件读出到输出流中  
       int readLength = in.read(bt);  
       while (readLength != -1) {  
           outStream.write(bt, 0, readLength);  
           readLength = in.read(bt);  
       }  
         
       //转换成byte 后 再格式化成位图  
       byte[] data = outStream.toByteArray();  
       Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);// 生成位图    
         
       return bitmap;  
   }  
//=============================================
// adapter内部类
// 指引页面数据适配器
class ViewPagerAdapter extends PagerAdapter {


@Override
public int getCount() {
return Integer.MAX_VALUE;//就要这么写!
}


@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}


@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return super.getItemPosition(object);
}


@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
// TODO Auto-generated method stub
((ViewPager) arg0).removeView(imgViews.get(arg1%imgViews.size())); 
}


@Override
public Object instantiateItem(View arg0, int arg1) {
// TODO Auto-generated method stub
// 获取新的view
((ViewPager) arg0).addView(imgViews.get(arg1%imgViews.size()),0);
return imgViews.get(arg1%imgViews.size());

}


@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
// TODO Auto-generated method stub


}


@Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}


@Override
public void startUpdate(View arg0) {
// TODO Auto-generated method stub


}


@Override
public void finishUpdate(View arg0) {
// TODO Auto-generated method stub


}
}


// 监听器内部类
// 指引页面更改事件监听器
class PointChangeListener implements OnPageChangeListener {


@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub


}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub


}


@Override
public void onPageSelected(int arg0) {
setImageBackground(arg0 %imgViews.size());


}

private void setImageBackground(int selectItems){
for(int i=0; i< pointViews.length; i++){
if(i == selectItems){
pointViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
}else{
pointViews[i].setBackgroundResource(R.drawable.page_indicator);
}
}
}
}




private Handler handler = new Handler() {





public void handleMessage(Message msg) {
switch (msg.what) {
case 0: {

//11. 设置main布局为当前Activity内容
setContentView(main);
//12. 设置viewPager 图片切换Adapter,图片最终能够切换就是在Adapter中实现的
viewPager.setAdapter(new ViewPagerAdapter());  
//13. 设置viewPager 页面改变监听器,利用监听器改变小圆点焦点状态
viewPager.setOnPageChangeListener(new PointChangeListener()); 

//设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动  
       viewPager.setCurrentItem(imgViews.size()*100);  

break;
}


}
};
};


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}








先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值