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

本文介绍了一种在Android应用中实现图片轮播与导航指示器的方法。通过使用ViewPager组件展示图片,并配合LinearLayout来实现底部导航小圆点的动态更新。文章详细展示了如何通过线程加载远程图片资源,并将其展示在界面上。

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

<?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;
}


}








内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值