皮皮网

【汽车打车系统源码】【qqskey登录源码】【stl源码开源】android图片轮播源码

2024-11-23 03:12:33 来源:资源整站源码

1.androidͼƬ?片轮ֲ?Դ??
2.android使用ViewPager实现轮播效果教程
3.安卓ViewFlipper的使用详解

android图片轮播源码

androidͼƬ?ֲ?Դ??

       Google相册,以其强大的播源功能,再次升级,片轮带来一项重要的播源用户体验优化——重新定位的选项行。这一改变,片轮对于现代屏幕尺寸的播源汽车打车系统源码手机用户来说,无疑是片轮个福音,让快速处理照片和视频变得更加便捷。播源在稳定版5..0.中,片轮"按住选择"功能现在位于屏幕底部,播源而非之前的片轮右上角。

       新的播源设计考虑到了操作的直观性,只需轻轻一按,片轮就能批量共享、播源存档或删除,片轮无需切换手部操作。Android Police指出,qqskey登录源码尽管目前还未全面普及,但这一变化已经在稳定版中亮相。

       底部的选项栏不仅包括常用联系人,还有你最近编辑的相册轮播,轻轻一点,就能快速添加选中的内容。左上角的计数器实时显示你选择的或视频数量,虽然切换到全新布局可能会有些许不适应,stl源码开源但它确实受到了欢迎,尤其是在大屏手机用户中。

       值得一提的是,"按住选择"的功能现在更加丰富,底部选项包括共享、存入特定相册、移至垃圾箱、存档、学源码编程直接从设备删除、编辑位置,甚至还有锁定文件夹,满足了用户对隐私和组织的更多需求。在iOS版本中,这个功能早已存在,因此Android用户也即将享受到这一便利。

       谷歌近期的博客模块源码更新中,"Locked Folder"功能的加入是另一大亮点,为照片安全提供了额外保障,内容存储在本地,无需担心云同步的问题。对于Pixel设备用户来说,这个备受期待的功能终于面向所有用户开放了。

       总之,谷歌相册的最新更新无疑在提升用户操作效率和隐私保护上迈出了一大步,我们期待更多这样的创新,让用户的照片管理体验更加顺畅和智能。如果你已经在Android设备上体验到了新的选项行,请务必分享你的使用感受。

android使用ViewPager实现轮播效果教程

       ViewPager:一个可以实现视图左右滑动切换的控件。

       ViewPager的基本使用:

       ViewPager的视图需要通过PagerAdapter来实现显示。

       PagerAdapter的主要方法:

       ● getCount 视图的数量

       ● instantiateItem 添加视图

       ● destroyItem 销毁视图

       ● isViewFromObject 是否由对象创建视图

       ViewPager的常用方法:

       setAdapter 设置适配器

       addOnPageChangeListener 监听页面切换的状态

       setCurrentItem 设置当前页面的索引

       实现广告轮播

       技术点分析:

       1、网络连接

       2、JSON解析

       3、ViewPager的初始化

       4、的异步加载

       5、圆点指示器的实现

       使用selector+shape实现圆点

       动态创建ImageView添加到集合中,同时添加到布局中

       在ViewPager切换事件中,切换圆点状态

       6、自动切换效果

       使用Handler的post方法,定时执行代码

       资源文件:

       mydot.xml //创建圆点资源,放在drawable文件下

       布局文件:

       activity_main.xml

       xmlns:tools=".edu.huse.banner_re.util;

       import android.graphics.Bitmap;

       import android.graphics.BitmapFactory;

       import android.os.AsyncTask;

       import java.io.IOException;

       import java.io.InputStream;

       import java.net.HttpURLConnection;

       import java.net.MalformedURLException;

       import java.net.URL;

       /

**

       * 加载的工具类

       * @author xray

       

*

       */

       public class ImageLoader {

       /

**

       * 加载完成的回调接口

       * 添加URL参数,用于做错位判断

       */

       public interface OnImageLoadListener{

       //完成加载

       void onImageLoadComplete(String url, Bitmap bitmap);

       }

       private OnImageLoadListener mListener;

       /

**

       * 启动加载任务

       * @param urlStr

       * @param listener

       */

       public void loadImage(String urlStr,OnImageLoadListener listener){

       this.mListener = listener;

       new ImageLoadTask().execute(urlStr);

       }

       /

**

       * 加载任务

       * @author xray

       

*

       */

       class ImageLoadTask extends AsyncTask

       @Override

       protected UrlAndBitmap doInBackground(String... params) {

       try {

       //创建URL,指定地址

       URL url = new URL(params[0]);

       //打开连接获得HttpURLConnection对象

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       //获得文件输入流

       InputStream stream = conn.getInputStream();

       //把输入流转换为

       Bitmap bmp = BitmapFactory.decodeStream(stream);

       //关闭流

       stream.close();

       return new UrlAndBitmap(params[0],bmp);

       } catch (MalformedURLException e) {

       e.printStackTrace();

       } catch (IOException e) {

       e.printStackTrace();

       }

       return null;

       }

       //包装地址和

       class UrlAndBitmap{

       String url;

       Bitmap bitmap;

       public UrlAndBitmap(String url, Bitmap bitmap) {

       this.url = url;

       this.bitmap = bitmap;

       }

       }

       @Override

       protected void onPostExecute(UrlAndBitmap result) {

       //进行接口回调

       if(mListener != null){

       mListener.onImageLoadComplete(result.url,result.bitmap);

       }

       }

       }

       }

       JSONLoader.java

       //读取服务器json

       package cn.edu.huse.banner_re.util;

       import android.os.AsyncTask;

       import java.io.IOException;

       import java.io.InputStream;

       import java.net.HttpURLConnection;

       import java.net.MalformedURLException;

       import java.net.URL;

       /

**

       * 读取服务器JSON的工具类

       * @author xray

       

*

       */

       public class JSONLoader {

       public interface OnJSONLoadListener{

       void onJSONLoadComplete(String json);

       }

       private OnJSONLoadListener mListener;

       public void loadJSON(String urlStr,OnJSONLoadListener listener){

       this.mListener = listener;

       new JSONLoadTask().execute(urlStr);

       }

       class JSONLoadTask extends AsyncTask

       @Override

       protected String doInBackground(String... params) {

       try {

       URL url = new URL(params[0]);

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       InputStream inputStream = conn.getInputStream();

       byte[] buffer = new byte[];

       int len = 0;

       //StringBuffer 线程安全,性能低 VS StringBuilder 线程不安全,性能高

       StringBuilder strB = new StringBuilder();

       while((len = inputStream.read(buffer)) != -1){

       //将字节码转换为String

       String str = new String(buffer,0,len);

       strB.append(str);

       }

       inputStream.close();

       return strB.toString();

       } catch (MalformedURLException e) {

       e.printStackTrace();

       } catch (IOException e) {

       e.printStackTrace();

       }

       return null;

       }

       @Override

       protected void onPostExecute(String result) {

       if(mListener != null){

       mListener.onJSONLoadComplete(result);

       }

       }

       }

       }

       MyViewPagerAdapter.java

       package cn.edu.huse.banner_re.adapter;

       import java.util.List;

       import android.support.v4.view.PagerAdapter;

       import android.view.View;

       import android.view.ViewGroup;

       import android.widget.ImageView;

       /

**

       * 轮播的适配器

       * @author Lenovo

       

*

       */

       public class MyViewPagerAdapter extends PagerAdapter {

       private List mData;

       public MyViewPagerAdapter(List mData) {

       this.mData = mData;

       }

       //返回视图的数量

       @Override

       public int getCount() {

       return mData.size();

       }

       @Override

       public boolean isViewFromObject(View arg0, Object arg1) {

       return arg0 == arg1;

       }

       //销毁

       @Override

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

       container.removeView(mData.get(position));

       }

       //添加

       @Override

       public Object instantiateItem(ViewGroup container, int position) {

       container.addView(mData.get(position));

       return mData.get(position);

       }

       }

       MainActivity.java

       package cn.edu.huse.banner_re;

       import java.util.ArrayList;

       import java.util.List;

       import org.json.JSONArray;

       import org.json.JSONObject;

       import android.app.Activity;

       import android.graphics.Bitmap;

       import android.os.Bundle;

       import android.os.Handler;

       import android.support.v4.view.ViewPager;

       import android.support.v4.view.ViewPager.OnPageChangeListener;

       import android.view.LayoutInflater;

       import android.view.View;

       import android.view.View.OnClickListener;

       import android.widget.ArrayAdapter;

       import android.widget.ImageView;

       import android.widget.LinearLayout;

       import android.widget.ListView;

       import android.widget.RadioButton;

       import cn.edu.huse.banner_re.adapter.MyViewPagerAdapter;

       import cn.edu.huse.banner_re.util.ImageLoader;

       import cn.edu.huse.banner_re.util.ImageLoader.OnImageLoadListener;

       import cn.edu.huse.banner_re.util.JSONLoader;

       import cn.edu.huse.banner_re.util.JSONLoader.OnJSONLoadListener;

       public class MainActivity extends Activity implements OnClickListener{

       public static final String URL_GIFT = "/majax.action?method=getGiftListpageno=1";

       public static final String URL_BASE = "";

       private ListView mLv;

       //放置圆点的布局

       private LinearLayout mLayout;

       private ViewPager mPager;

       //保存viewpager上的集合

       private List mImageViews;

       //保存圆点的集合

       private List mDotViews;

       //当前

       private ImageView mDotView;

       //当前下标

       private int mIndex;

       private Handler mHandler = new Handler();

       @Override

       protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       //初始化viewpager

       initViewPager();

       }

       private void initViewPager() {

       new JSONLoader().loadJSON(URL_GIFT, new OnJSONLoadListener() {

       @Override

       public void onJSONLoadComplete(String json) {

       //得到的地址

       List list = josnPare(json);

       //初始化主控件

       initView();

       //将显示到viewpager中

       initImageViews(list);

       //为ViewPager设置适配器

       mPager.setAdapter(new MyViewPagerAdapter(mImageViews));

       //加载圆点

       initDot(mImageViews.size());

       //实现的轮播

       mPager.postDelayed(new Runnable() {

       @Override

       public void run() {

       //下标自动++

       mIndex++;

       //当下标到最后时,就重新来过

       if(mIndex = mImageViews.size()){

       mIndex = 0;

       }

       //设置

       mPager.setCurrentItem(mIndex);

       //重复调用

       mHandler.postDelayed(this, );

       }

       }, );

       //添加页码滑动的监听,实现圆点的切换

       mPager.setOnPageChangeListener(new OnPageChangeListener() {

       //页选中后调用

       @Override

       public void onPageSelected(int arg0) {

       //改变原来的圆点的状态

       mDotView.setEnabled(true);

       //更新当前的圆点

       mDotView = mDotViews.get(arg0);

       //将当前选中的圆点设为选中状态

       mDotView.setEnabled(false);

       //更新下标

       mIndex = arg0;

       }

       //滑动中途调用

       @Override

       public void onPageScrolled(int arg0, float arg1, int arg2) {

       }

       //页面滑动状态修改

       @Override

       public void onPageScrollStateChanged(int arg0) {

       }

       });

       }

       });

       }

       /**获取圆点函数

       * @param count viewpager上的数量

       */

       private void initDot(int count){

       mDotViews = new ArrayList();

       LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

       LinearLayout.LayoutParams.WRAP_CONTENT,

       LinearLayout.LayoutParams.WRAP_CONTENT);

       //设置边距

       params.setMargins(5, 0, 5, 0);

       for(int i = 0; i count; i++){

       ImageView image = new ImageView(this);

       //设置圆点

       image.setImageResource(R.drawable.mydot);

       //设置的位置,方便后面的取值

       image.setTag(i);

       //设置监听

       image.setOnClickListener(this);

       //添加到布局中

       mLayout.addView(image, params);

       //将圆点保存到集合中

       mDotViews.add(image);

       }

       mDotView = mDotViews.get(0);

       mDotView.setEnabled(false);

       }

       /

**

       *显示的函数

       */

       private void initImageViews(List list) {

       mImageViews = new ArrayList();

       for(String str : list){

       final ImageView imageView = new ImageView(this);

       //设置默认

       imageView.setImageResource(R.drawable.ic_launcher);

       new ImageLoader().loadImage(URL_BASE+str, new OnImageLoadListener() {

       @Override

       public void onImageLoadComplete(String url, Bitmap bitmap) {

       if(bitmap != null){

       imageView.setImageBitmap(bitmap);

       }

       }

       });

       //将ImageView保存到集合中

       mImageViews.add(imageView);

       }

       }

       /

**

       * JSON解析获取的地址

       * @param url

       * @return

       */

       private List josnPare(String url){

       List list = new ArrayList();

       try {

       JSONObject jobj = new JSONObject(url);

       JSONArray array = jobj.getJSONArray("ad");

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

       JSONObject obj = (JSONObject) array.get(i);

       list.add(obj.getString("iconurl"));

       }

       } catch (Exception e) {

       e.printStackTrace();

       }

       return list;

       }

       /

**

       * 初始化控件

       */

       private void initView() {

       //找到控件

       mLv = (ListView) findViewById(R.id.lv_list);

       View view = LayoutInflater.from(this).inflate(R.layout.activity_banner, null);

       mPager = (ViewPager)view.findViewById(R.id.vp_image);

       //圆点布局

       mLayout = (LinearLayout)view.findViewById(R.id.layout);

       //模拟数据

       List mList = new ArrayList();

       for(int i = 0; i ; i++){

       mList.add("条目--"+i);

       }

       //创建适配器

       ArrayAdapter mAdapter = new ArrayAdapter(this,

       android.R.layout.simple_list_item_1,

       android.R.id.text1,

       mList);

       //设置头部视图

       mLv.addHeaderView(view);

       //设置适配器

       mLv.setAdapter(mAdapter);

       /*//圆点布局

       mLayout = (LinearLayout)findViewById(R.id.layout);*/

       }

       /

**

       * 圆点的监听事件

       */

       @Override

       public void onClick(View arg0) {

       //获取该圆点的位置

       int index = Integer.parseInt(arg0.getTag().toString());

       //将viewpager的显示成下标为index的

       mPager.setCurrentItem(index);

       //将原来的设置成默认值

       mDotView.setEnabled(true);

       //保存新的值

       mDotView = (ImageView) arg0;

       //将新的值改变成false

       mDotView.setEnabled(false);

       //更新下标

       mIndex = index;

       }

       }

       注意:因为这里用到了json解析,需要用到联网操作,一定要写上上网的权限:

             运行效果:

安卓ViewFlipper的使用详解

       ViewFlipper的介绍和使用

       ViewFlipper是Android自带的一个多页面管理控件,且可以自动播放!和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候,用来实现进入应用后的引导页,或者用于图片轮播。

一、常用的属性和方法

       å±žæ€§ï¼š

android:inAnimation//设置View或ImageView进入屏幕时使用的动画android:outAnimation//设置View或ImageView退出屏幕时使用的动画android:flipInterval//设置View或ImageView之间切换的时间间隔

       å¸¸ç”¨æ–¹æ³•ï¼š

       setInAnimation:设置View或ImageView进入屏幕时使用的动画

       setOutAnimation:设置View或ImageView退出屏幕时使用的动画

       showNext:调用该方法来显示ViewFlipper里的下一个View或ImageView

       showPrevious:调用该方法来显示ViewFlipper的上一个View或ImageView

       setFilpInterval:设置View或ImageView之间切换的时间间隔

       startFlipping:使用上面设置的时间间隔来开始切换所有的View或ImageView,切换会循环进行

       stopFlipping:停止View或ImageView切换

二、静态导入

       è¿è¡Œæ•ˆæžœï¼š

       å®žçŽ°è¿™ä¸ªæ•ˆæžœéžå¸¸çš„简单

       ç¼–写viewpfilper.xml布局文件

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ViewFlipperandroid:id="@+id/flipper"android:layout_width="match_parent"android:layout_height="match_parent"android:flipInterval=""><ImageViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:scaleType="centerCrop"android:src="@drawable/tx1"/><ImageViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:scaleType="centerCrop"android:src="@drawable/tx2"/><ImageViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:scaleType="centerCrop"android:src="@drawable/tx3"/><ImageViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:scaleType="centerCrop"android:src="@drawable/tx4"/></ViewFlipper></LinearLayout>

       ç¼–写ViewFliper活动代码

publicclassViewpFilperextendsAppCompatActivity{ privateViewFlippermFilper;@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.viewpfilper);mFilper=findViewById(R.id.flipper);mFilper.startFlipping();}}

       å½“我们添加了动画的时候,效果就变成这样了:

       æˆ‘们在res目录下新建一个anim文件夹,再新建right_in.xml、right_out.xml存放动画

       right_in.xml

<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"><translateandroid:duration=""android:fromXDelta="%p"android:toXDelta="0"/></set>

       right_out.xml

<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"><translateandroid:duration=""android:fromXDelta="0"android:toXDelta="-%p"/></set>

       æœ€åŽåœ¨viewpfilper.xml布局文件中引用就行

二、动态导入(支持手势滑动)

       æˆ‘们可以通过对手势的监听,自由的滑动。不滑动也可以自己动。轮播图就是这样效果。

       è¿è¡Œæ•ˆæžœï¼š

       æˆ‘们在上一个代码的基础上修改。

       åœ¨anim文件下再添加left_in.xml、left_out.xml,让我们左右滑动更加的流畅

       left_in.xml

<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"><translateandroid:duration=""android:fromXDelta="-%p"android:toXDelta="0"/></set>

       left_in.xml

<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"><translateandroid:duration=""android:fromXDelta="0"android:toXDelta="%p"/></set>

       å°†right_in.xml、right_out.xml的属性Android:duration=""设置为,和左右进出的一样,不然滑动会很慢,还有左右滑动不和谐

       GestureDetector手势检测器,监听我们的手势动作

       å¹¶ä¸”重写onTouchEvent触发MyGestureListener里的方法

       å¸ƒå±€æ–‡ä»¶ä¸å˜

       ç¼–写ViewFliperActivity的java代码

publicclassViewpFilperextendsAppCompatActivity{ privateViewFlippermFilper;privateGestureDetectormDetector;//手势探测器privateMyGestureListenermMyGestureListener;@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.viewpfilper);mFilper=findViewById(R.id.flipper);//实例化SimpleOnGestureListener与GestureDetector对象mMyGestureListener=newMyGestureListener();mDetector=newGestureDetector(this,mMyGestureListener);mFilper.startFlipping();}@OverridepublicbooleanonTouchEvent(MotionEventevent){ returnmDetector.onTouchEvent(event);}privateclassMyGestureListenerextendsGestureDetector.SimpleOnGestureListener{ privatefinalstaticintMIN_MOVE=;//最小距离//OnFling中根据X轴方向移动的距离和速度来判断当前用户是向左滑还是向右滑,//从而利用showPrevious()或者showNext()来显示上一张或者下一张图片@OverridepublicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){ if(e1.getX()-e2.getX()>MIN_MOVE){ mFilper.setInAnimation(getApplicationContext(),R.anim.right_in);mFilper.setOutAnimation(getApplicationContext(),R.anim.right_out);mFilper.showNext();}elseif(e2.getX()-e1.getX()>MIN_MOVE){ mFilper.setInAnimation(getApplicationContext(),R.anim.left_in);mFilper.setOutAnimation(getApplicationContext(),R.anim.left_out);mFilper.showPrevious();}returntrue;}}}

       åˆ°è¿™é‡ŒViewFlipper的基本使用就差不多了。