经过(一)的基础介绍,现在小编将在(二)中给大家介绍以下几种效果:

1、点击查看组图(模拟QQ空间图片浏览)

2、缩略图放大(自定义Dialog)

3、动态加载进度条

一、点击产看组图(模拟QQ空间图片浏览)

Android提供给我们一个专门处理这种问题的插件:Gallary。顾名思义,就是展示图片的画廊。它可以实现图片的成组浏览,包括选中高亮,循环滚动等效果,可以实现诸如网站的滚动图片效果。当然gallery的使用还是需要adapter的介入。今天带大家做一个小例子,里面便会介绍gallery的所有常用方法。代码拿来:

首先是自定义的Gallery的图片适配器:

package com.teach.gallery;
/*** @author Arthur Lee* @time 05/01/2014* */
import java.util.List;
import com.teach.demo.R;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
/*** ImageAdapter用来配置gallery,之所以重写gallery的适配器,* 在于组图资源在实际开发中是不固定的,我们需要不断的从服务端获取当前用户的信息,* 因此我们需要一个可以通用的适配器*/
public class ImageAdapter extends BaseAdapter{private List<Integer> img;        //存放图片 ID的数组,这里也可以设置成存放图片保存路径的private Context context;          //获取当前Activity();public ImageAdapter(Context context,List<Integer> img){this.context = context;this.img = img;}//获取组图的容量@Overridepublic int getCount() {// TODO Auto-generated method stubreturn img.size();/**①* 如果我们要是想实现循环付滚动图片,只需改动两个地方,一是把本处的返回值改为* return Integer.MAX_VALUE;* 即返回整形的最大值* 二是在getView中通过取余的方法获取当前img中的数据* 理论依据与循环链表的实现一致,*/}//获取当前图片@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn img.get(position);}//获取当前图片的ID@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View view, ViewGroup parent) {// TODO Auto-generated method stubImageView image = new ImageView(context);/**②*将本处修改为image.setBackgroundResource(img.get(position%img.size()));* 即可实现循环滑动*/image.setBackgroundResource(img.get(position));//设置图片形式为居中缩放image.setScaleType(ImageView.ScaleType.CENTER_INSIDE);/*** 添加本句话可是想选中区域高亮的效果*///image.setBackgroundColor(Color.alpha(1));return image;}}

接下来是提供图片资源的Factory:

package com.teach.gallery;
/*** @author Arthur Lee* @time 05/01/2014* */
import java.util.ArrayList;
import java.util.List;import com.teach.demo.R;public class ImageFactory {/*** 本方法用于处理从服务端发送回来的数据,在此处先简单设置不详细叙述,具有方法在第八讲介绍*/public static final List<Integer> getImgResource(){List<Integer> list = new ArrayList<Integer>();for(int i=0;i<5;i++){list.add(R.drawable.ic_launcher);}return list;}
}

gallery所对用的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><!-- @author Arthur Lee --><!-- 垂直分布三个,以ABC标记 --><!-- A --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"></LinearLayout><!-- B --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="4"><!-- 水平分布三个,以123标记 --><!-- 1 --><LinearLayout android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"></LinearLayout><!-- 2 --><LinearLayout android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="4"> <!-- 组图浏览区域 --><Gallery android:id="@+id/third_gallery"android:gravity="center_vertical|center_horizontal"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout><!-- 3 --><LinearLayout android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"></LinearLayout></LinearLayout><!-- C --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"></LinearLayout></LinearLayout>

其效果图如下:当然小编偷懒了,大家就凑合着看看吧,具体的其他功能小编在代码中已注明,大家可以尝试的去修改一下,便会体会到Gallery的魅力了。

二、点击查看缩略图

带大家做这个效果,其实是想教大家如何自定义弹出框的样式,虽然Android的弹出框很方便实用,但我们还是想把它用到极致,所以Android便提供了一个getView()的方法,让开发者们可以去DIY了。这个缩略图放大就是DIY了一个专门放置图片的View,通过放大Dialog和View的宽高,实现小图的放大效果。大家在制作其他DIY弹出框时,也是按照同样的流程即可,只需改变其中的控件就行了。代码如下:

//设置自定义的对话框public void setDIYDialog(){View view  = inflater.inflate(R.layout.third_image, null);ImageView imgView = (ImageView)view.findViewById(R.id.third_imageview);TextView tView = (TextView)view.findViewById(R.id.third_image_tx);imgView.setBackgroundResource(R.drawable.ic_launcher);tView.setText("这是一个缩略图放大效果");//放大图片至屏幕的90%/*** LayoutParams 是ViewGroup的一个子类,用以设置当前param的长宽值*/LayoutParams para =  imgView.getLayoutParams();para.height = MainActivity.displayHeight/10*9;  para.width = MainActivity.displayWidth/10*9;  imgView.setLayoutParams(para);  final AlertDialog dialog =  new AlertDialog.Builder(context).create();       //去除边框dialog.setView(view,0,0,0,0);dialog.show();//控制Dialog的大小,将其和图片放大到同样大小WindowManager.LayoutParams params = dialog.getWindow().getAttributes();params.width = MainActivity.displayWidth/10*9;params.height = MainActivity.displayHeight/10*9;//改变AlertDialog至屏幕的90%dialog.getWindow().setAttributes(params);view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub/*** 用cancel和dismiss关闭Dialog的效果一样,只是它们在后台调用的机制不同罢了*/dialog.cancel();}});}
//在MainActivty中获取当前屏幕的宽高,为后面的缩放提供数据
DisplayMetrics dm=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);displayWidth=dm.widthPixels;displayHeight=dm.heightPixels-80;

其对应的XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><!-- @author Arthur Lee --><!-- 垂直分布三个,以ABC标记 --><!-- A --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"></LinearLayout><!-- B --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="4"><!-- 水平分布三个,以123标记 --><!-- 1 --><LinearLayout android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"></LinearLayout><!-- 2 --><LinearLayout android:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="vertical"android:layout_weight="4"> <!-- 缩放区域 --><ImageView android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/third_imageview"android:scaleType="centerInside"android:layout_weight="7"/><TextView android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/third_image_tx"android:layout_weight="1"android:text=""/></LinearLayout><!-- 3 --><LinearLayout android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"></LinearLayout></LinearLayout><!-- C --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"></LinearLayout></LinearLayout>

三、动态加载进度条

在下载图片、文件、升级软件的过程中,为了提高用户体验水平,显示进度条是再好不过的事情。控制进度条的下载很简单,就是一个单线程的操作,我们只需在加载完成时,在线程中发出一个Message给主线程(整个Activity就是一个主线程,一个APP就只有一个主线程,其他的都是子线程),改变当前的UI状态即可。

代码如下:

//设置动态进度条public void setAutoProgress(){int count = 0;pDialog = new ProgressDialog(context);//设置进度条模式为水平模式。pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//是够可通过点击页面返回pDialog.setCancelable(true);//进度条的显示是否不明确pDialog.setIndeterminate(false);//设计进度条的容量,可以指定为下载文件或zip包的大小,这里假设为1000pDialog.setProgress(1000);pDialog.setTitle("进度条");pDialog.setMessage("这是提示信息");pDialog.show();time.start();////}Thread time = new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubtry{while(count<101){pDialog.setProgress(count++);Thread.sleep(100);}/***我们无法在单独的线程中改变当前UI的状态,*只有通过Handler向主线程传送消息,通知主线程来改变当前UI状态 */mHandler.sendEmptyMessage(0);}catch(Exception e){e.printStackTrace();}}};//设置Handler参数 ,用来通知主线程做出相应的规划Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);//Message的what方法是用来传送数值的,这种方法最通用//不懂switch的回去看书switch(msg.what){case 0:pDialog.cancel();break;default:break;}}};

效果图如下:

当然:这些程序依然部署在我们第一讲中做的Fragment中,没看的观众可以回顾一下点击打开链接,

下面就是整合后的代码原貌:

package com.teach.dialog;
/*** @author Arthur Lee* @time 04/21/2014* */
import java.util.ArrayList;
import java.util.List;import com.teach.demo.MainActivity;
import com.teach.demo.R;
import com.teach.gallery.ImageAdapter;
import com.teach.gallery.ImageFactory;import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;public class DialogSpecialHelper {private Context context;private LayoutInflater inflater;private Gallery gallery;private int count = 0;private ProgressDialog pDialog;public DialogSpecialHelper(Context context){this.context = context;this.inflater = LayoutInflater.from(context);}//设置自定义的对话框public void setDIYDialog(){View view  = inflater.inflate(R.layout.third_image, null);ImageView imgView = (ImageView)view.findViewById(R.id.third_imageview);TextView tView = (TextView)view.findViewById(R.id.third_image_tx);imgView.setBackgroundResource(R.drawable.ic_launcher);tView.setText("这是一个缩略图放大效果");//放大图片至屏幕的90%/*** LayoutParams 是ViewGroup的一个子类,用以设置当前param的长宽值*/LayoutParams para =  imgView.getLayoutParams();para.height = MainActivity.displayHeight/10*9;  para.width = MainActivity.displayWidth/10*9;  imgView.setLayoutParams(para);  final AlertDialog dialog =  new AlertDialog.Builder(context).create();       //去除边框dialog.setView(view,0,0,0,0);dialog.show();//控制Dialog的大小,将其和图片放大到同样大小WindowManager.LayoutParams params = dialog.getWindow().getAttributes();params.width = MainActivity.displayWidth/10*9;params.height = MainActivity.displayHeight/10*9;//改变AlertDialog至屏幕的90%dialog.getWindow().setAttributes(params);view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub/*** 用cancel和dismiss关闭Dialog的效果一样,只是它们在后台调用的机制不同罢了*/dialog.cancel();}});}//实现浏览图组的功能public void setGallary(){View view = inflater.inflate(R.layout.third_gallery, null);gallery = (Gallery)view.findViewById(R.id.third_gallery);List<Integer> img = new ArrayList<Integer>();img = ImageFactory.getImgResource();ImageAdapter iAapter = new ImageAdapter(context,img);gallery.setAdapter(iAapter);//设置组图开始浏览的位置。/**③* 该处还可以配合ImageAdapter中的①②,实现循环浏览,只需把setSelection的起始位置设的足够大即可* 例如:gallery.setSelection(img.size()*50);*/gallery.setSelection(0);//当前图片没有选中时,处于阴影区域,只有选中时,才会高亮显示,与ImageAdaper中的getView方法配合使用。gallery.setUnselectedAlpha(0.3f);//设置图片间距gallery.setSpacing(50);/***用于监听当前图片点击选中时的操作。滑动时不触发 *///gallery.setOnItemClickListener(listener);/*** 用于监听当前图片滑动选中时的操作*///gallery.setOnItemSelectedListener(listener);final AlertDialog dialog =  new AlertDialog.Builder(context).create();        //去除边框dialog.setView(view,0,0,0,0);dialog.show();//点击当前图片时退出浏览gallery.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubdialog.dismiss();}});}//设置动态进度条public void setAutoProgress(){int count = 0;pDialog = new ProgressDialog(context);//设置进度条模式为水平模式。pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//是够可通过点击页面返回pDialog.setCancelable(true);//进度条的显示是否不明确pDialog.setIndeterminate(false);//设计进度条的容量,可以指定为下载文件或zip包的大小,这里假设为1000pDialog.setProgress(1000);pDialog.setTitle("进度条");pDialog.setMessage("这是提示信息");pDialog.show();time.start();////}Thread time = new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubtry{while(count<101){pDialog.setProgress(count++);Thread.sleep(100);}/***我们无法在单独的线程中改变当前UI的状态,*只有通过Handler向主线程传送消息,通知主线程来改变当前UI状态 */mHandler.sendEmptyMessage(0);}catch(Exception e){e.printStackTrace();}}};//设置Handler参数 ,用来通知主线程做出相应的规划Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);//Message的what方法是用来传送数值的,这种方法最通用//不懂switch的回去看书switch(msg.what){case 0:pDialog.cancel();break;default:break;}}};
}

本次放在了第三页面上:

package com.teach.demo;
/*** @author Arthur Lee* @time 04/08/2014* */
import com.teach.dialog.DialogSpecialHelper;import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;public class ThirdFragment extends Fragment{//缓存视图private View view;private DialogSpecialHelper dsHelper;private Button bt_special_gallery,bt_special_progress;private ImageButton bt_special_picture;@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stub//如果当前视图为空,初始化视图if(view == null){//指定当前视图在viewpager中显示的是view_first。xml,通过LayoutInflater来指定.view = inflater.inflate(R.layout.view_third, null);}//指定当前视图的父类,以便调用父类的移除功能。ViewGroup parent = (ViewGroup) view.getParent();if (parent != null) {parent.removeView(view);}bt_special_gallery = (Button) view.findViewById(R.id.bt_special_gallery);bt_special_picture = (ImageButton) view.findViewById(R.id.bt_special_picture);bt_special_progress = (Button)view.findViewById(R.id.bt_special_progress);dsHelper = new DialogSpecialHelper(getActivity());bt_special_gallery.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubdsHelper.setGallary();}});bt_special_picture.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubdsHelper.setDIYDialog();}});bt_special_progress.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubdsHelper.setAutoProgress();}});return view;}}

虽然写博客很麻烦,不过只要大家能学到东西,小编我就心满意足了。

最后还是一句话结尾:我不是一个好的程序员,因为我只会默默奉献。

学徒浅析Android开发:第三讲——Dialog的常用方法介绍(二)相关推荐

  1. Android开发之自定义dialog的实现(源代码分享)

    使用系统自带的dialog如果不能满足我们日常开发的需求,那就得自己构建custom dialog,特别是对于一个app来说,统一的样式风格会给人一种舒服的感觉,所以dialog的样式 .色调一般都要 ...

  2. android开发常用组件和第三方库(二)

    TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending, github搜索:https://github.com ...

  3. 求助帖:android开发初期:为什么我在活动二设置的singInstance模式跑到活动三去了???

    求android开发的高手帮我看看这个问题吧: <activity android:name=".SecondActivity"             android:la ...

  4. 《android开发艺术探索》读书笔记(二)--IPC机制

    接上篇<android开发艺术探索>读书笔记(一) No1: 在android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process ...

  5. Android开发之设置Dialog外部页透明的方法亲测可用

    老套路先看默认的弹框 再看处理后透明的弹框 实现方法也很简单,只需要给dialog设置一个透明的主题,主题很重要! <style name="transparent_dialog&qu ...

  6. Android开发--WIFI输入密码Dialog的实现

    最终实现效果是点击一个未保存密码的WIFI信号时,弹出如下Dialog: 1.定义Dialog的布局文件: <a target=_blank id="L1" href=&qu ...

  7. android activity获取dialog对象,Android开发笔记之:Dialog的使用详解

    Dialog是任何系统都必须有的一个控件,作为辅助窗口,用于显示一些消息,或请求用户采取一引起操作等. 在Android中也不例外,基本使用可能参看文档. 使用时的注意事项1. BACK键能取消掉对话 ...

  8. Android开发之自定义Dialog二次打开报错问题解决

    之前自定义了一个AlertDialog对话框,第一次点击时正常,但第二次调用时会出现错误:java.lang.IllegalStateException: The specified child al ...

  9. 学徒浅析Android——Android7.0(N)对于自定义证书和非CA机构证书的适配校验

    本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布   对于Android N之前自定义或非CA证书的使用,一般有两种方式: 1.自定义X509TurstManager和Hostname ...

最新文章

  1. 微信小程序顶部tab切换以及滑动
  2. 干货丨史上最好记的神经网络结构速记表(经典资源,值得收藏)
  3. android关于设置list_item高度问题
  4. TF-IDF与余弦相似性的应用
  5. sharepoint 2010学习资源汇总
  6. 爬虫的增量式抓取和数据更新
  7. 超过1.2W星的「机器学习路线图」,你的收藏夹可以更新了!
  8. 有趣的圣诞节 库的打包
  9. C#中的字符与字符串
  10. Linux RedHat 5.2 构建PostFix邮件服务器
  11. Python--day45--pymysql模块初识以及SQL注入
  12. 提供两个卡巴斯基的授权文件
  13. m苹果放n篮子_m个苹果放入n个篮子
  14. 做一个业务中台你到底会踩多少坑?
  15. 富豪刑警 富豪刑警修斯库界面效果实现
  16. 数论函数 - 莫比乌斯函数与莫比乌斯反演 - 基础杜教筛
  17. 侯捷C++->组合与继承
  18. 网络流量监控 v3.0 下载
  19. 2019.08.29考试报告
  20. 国际分子植物与微生物互作学会(MPMI)2023年大会(美国罗德岛7.16-20)

热门文章

  1. Android 碎屏效果 (Crack Screen,击碎屏幕)
  2. [实用]推荐一些非常棒的前端网站
  3. 课程设计之音乐播放器
  4. 北京出租车协会:司机拒载砍价暂停上岗1至3年
  5. 小程序网络请求wx.request总结
  6. 计算机电源安在哪里,打开计算机电源并按del键后如何在U盘中安装系统
  7. IBM公司新款处理器宣称将提供新的数据加密级别
  8. python中字典,文件,异常
  9. Linux配置清华大学yum源,关于清华大学yum源的配置
  10. 2021年起重机械指挥考试及起重机械指挥考试试卷