android 首页弹窗
现在很多app 登录首页都会有首页弹窗的功能,最近公司也紧跟潮流需求提出要做首页弹窗
上效果图
思路简单
1.登录app 时请求网络通过接口获取数据
公司自己定的网络框架异步的网络请求
remote.requestText(req.getRequestMethod(), null,req.toJsonString(), newTextTaskCallback() {
@Override
protectedResponseDatacreateResponseData(String jsonObj) {
return new ResponseData();
}
@Override
protected voidsuccess( Result pojo) {
result= pojo;
finalDataInfo data =result.getData();
if(data !=null&& data.getId() !=null) {
LogUtil.v("首页弹窗图片地址:"+data.getPicture());
//图片没有显示过需要处理,如果图片显示过则不处理
if(data.getId()!=applicationPreference.getHomeDialogId()) {
if(!data.getCache()){//如果是不缓存的,直接下载
downloadImage();
}else{
//如果要是缓存的,文件存在直接显示,文件不存在则下载
File file = getFileFullName(data.getId());
if(file.exists()) {//如果图片存在
showDialog1(file);
}else{//图片不存在,下载图片
downloadImage();
}
}
});
2.下载图片downloadImage();
newThread() {
@Override
public voidrun() {
DataInfo data =result.getData();
String image_url = data.getPicture();
File file=getFileFullName(data.getId());
URL url;
try{
url =newURL(image_url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// 获取本地文件
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
intcode = conn.getResponseCode();
if(code ==200) {
// 下载图片
InputStream is = conn.getInputStream();
FileOutputStream fos =newFileOutputStream(file);
byte[] buffer =new byte[1024];
intlen =0;
while((len = is.read(buffer)) != -1) {
fos.write(buffer,0,len);
}
is.close();
fos.close();
Message msg =newMessage();
msg.what=0;
msg.obj= file;
下载完了发消息
handler.sendMessage(msg);
}else{
LogUtil.e("下载首页弹窗图片失败,服务端返回代码:"+ code);
}
}catch(Exception e) {
file.delete();
e.printStackTrace();
LogUtil.e("下载首页弹窗图片失败,服务端返回代码:"+ e.getMessage());
}
}
}.start();
3.最关键的布局中显示
因为在framelayout 中 上层点击事件会被中断
WindowManager windowManager = ((Activity)mContext).getWindowManager();
Display display = windowManager.getDefaultDisplay();
floatwidth = display.getWidth() /10*8;
Bitmap image = BitmapFactory.decodeFile(file.getPath());
floatheight = (float) width / image.getWidth() * image.getHeight();
//弹窗样式无黑边
finalDialog dialog =newDialog(mContext,R.style.dialog);
LayoutInflater inflater = LayoutInflater.from(mContext);
View layout = inflater.inflate(R.layout.dialog_home, null);
ViewGroup.LayoutParams lp =newViewGroup.LayoutParams((int) width,(int) height);
dialog.setContentView(layout,lp);
dialog.setOnShowListener(newDialogInterface.OnShowListener() {
@Override
public voidonShow(DialogInterface dialog) {
applicationPreference.setHomeDialogId(result.getData().getId());
}
});
dialog.show();
弹框会有黑边解决方案:
总结看似简单,还是有不少坑的。framelayout 中 上层点击事件会被中断,弹框会有黑边
都好了不少时间,第一次写 ,感觉好乱。。。