Android实现加载广告图片和倒计时的开屏布局
作者:shichen2014 发布时间:2023-04-29 13:54:45
标签:Android,布局
这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局。程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码。
具体实现代码如下:
package cn.waps.extend;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.qcn.wzlz.AppConnect;
import com.qcn.wzlz.SDKUtils;
public class LoadingPopAd {
private final static Handler mHandler = new Handler();
private static LoadingPopAd loadingAppPopAd;
public static LoadingPopAd getInstance(){
if(loadingAppPopAd == null){
loadingAppPopAd = new LoadingPopAd();
}
if (Looper.myLooper() == null) {
Looper.prepare();
}
return loadingAppPopAd;
}
/**
* 获取开屏布局
* @param context
* @param time
* @return
*/
public View getContentView(Context context, int time){
return getLoadingLayout(context, time);
}
private LinearLayout getLoadingLayout(final Context context, final int time){
// 整体布局
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.CENTER);
int bg_id = context.getResources().getIdentifier("loading_bg", "drawable", context.getPackageName());
if(bg_id != 0){
layout.setBackgroundResource(bg_id);
}
// 加载广告图片和倒计时的布局,用与
LinearLayout l_layout = new LinearLayout(context);
l_layout.setGravity(Gravity.CENTER);
// 设置LayoutParams,划分额外空间比例为6分之5(具体权重比例可根据自己需求自定义)
l_layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1f));
// 加载图片的布局
RelativeLayout pop_layout = new RelativeLayout(context);
TextView timeView = new TextView(context);
timeView.setText("剩余" + time + "秒");
timeView.setTextSize(10);
timeView.setTextColor(Color.BLACK);
timeView.setPadding(8, 3, 6, 2);
int num = 12;
// 对手机进行屏幕判断
int displaySize = SDKUtils.getDisplaySize(context);
if(displaySize == 320){
num = 8;
}else if(displaySize == 240){
num = 6;
}else if(displaySize == 720){
num = 16;
}else if(displaySize == 1080){
num = 20;
}
float[] outerRadii = new float[] { 0, 0, num, num, 0, 0, num, num};
ShapeDrawable timeView_shapeDrawable = new ShapeDrawable();
timeView_shapeDrawable.setShape(new RoundRectShape(outerRadii, null, null));
timeView_shapeDrawable.getPaint().setColor(Color.argb(255, 255, 255, 255));
timeView.setBackgroundDrawable(timeView_shapeDrawable);
//异步执行倒计时
//异步加载广告图片
new ShowPopAdTask(context, pop_layout, timeView).execute();
new TimeCountDownTask(timeView, time).execute();
TextView textView = new TextView(context);
textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 5f));
textView.setText("正在启动,请稍后...");
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.WHITE);
l_layout.addView(pop_layout);
layout.addView(l_layout);
layout.addView(textView);
return layout;
}
private class TimeCountDownTask extends AsyncTask<Void, Void, Boolean>{
TextView timeView;
int limit_time = 0;
TimeCountDownTask(TextView timeView, int time){
this.timeView = timeView;
this.limit_time = time;
}
@Override
protected Boolean doInBackground(Void... params) {
while(limit_time > 0){
mHandler.post(new Runnable(){
@Override
public void run() {
timeView.setText("剩余" + limit_time + "秒");
}
});
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
limit_time--;
}
return null;
}
}
private class ShowPopAdTask extends AsyncTask<Void, Void, Boolean>{
Context context;
RelativeLayout pop_layout;
LinearLayout popAdView;
TextView timeView;
int height_full = 0;
int height = 0;
ShowPopAdTask(Context context, RelativeLayout pop_layout, TextView timeView){
this.context = context;
this.pop_layout = pop_layout;
this.timeView = timeView;
}
@Override
protected Boolean doInBackground(Void... params) {
try {
height_full = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight();
int height_tmp = height_full - 75;//75为设备状态栏加标题栏的高度
height = height_tmp * 5/6;
while(true){
if(((Activity)context).getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE
&& height_full <= 480){
popAdView = AppConnect.getInstance(context).getPopAdView(context, height, height);
}else{
popAdView = AppConnect.getInstance(context).getPopAdView(context);
}
if(popAdView != null){
mHandler.post(new Runnable(){
@Override
public void run() {
pop_layout.addView(popAdView);
popAdView.setId(1);
//倒计时布局所需的LayoutParams
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_TOP, popAdView.getId());
params.addRule(RelativeLayout.ALIGN_RIGHT, popAdView.getId());
// 对手机进行屏幕判断
int displaySize = SDKUtils.getDisplaySize(context);
if(displaySize == 320){
params.topMargin=1;
params.rightMargin=1;
}else if(displaySize == 240){
params.topMargin=1;
params.rightMargin=1;
}else if(displaySize == 720){
params.topMargin=3;
params.rightMargin=3;
}else if(displaySize == 1080){
params.topMargin=4;
params.rightMargin=4;
}else{
params.topMargin=2;
params.rightMargin=2;
}
pop_layout.addView(timeView, params);
}
});
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
0
投稿
猜你喜欢
- static :静态常量,静态方法,静态代码块静态变量: 静态变量属于类的,使用类名来访问,非静态变量是属于对象的,"必须&quo
- 程序的结构分类:顺序结构:按照写代码的顺序 一次执行选择结构:根据条件的不同有选择的执行不同的代码循环结构:在一定条件下 反复执行某一片代码
- 前言我们有时候在开发中,遇到这样的问题,就是我们需要小程序授权登录我们自己的后台,通过小程序的信息换取我们自己后台的token,实现账号密码
- 本文实例讲述了C#实现生成所有不重复的组合功能。分享给大家供大家参考,具体如下:给你几个字母,比如(a,b,c,d,e,f),要求生成所有不
- protobuf 是 google的一个开源项目,可用于以下两种用途:(1)数据的存储(序列化和反序列化),类似于xml、json等;(2)
- 介绍装饰者模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,增加对象功能来说,装饰模式比生成子类实现更为灵活。
- 1.导入相关jar包,具体哪些包我记不太清了2.在applicationContext中加入相关配置信息,如下所示:<beans xm
- 大家都知道NPOI组件可以在你本地没有安装office的情况下来 读取,创建excel文件。但是大家一般都是只默认读取一个excel文件的第
- mybatis Integer类型参数动态sql注意条件例如以下拼接的动态sql<if test="work_status
- Spring数据源的配置数据源(连接池)的作用数据源(连接池)是提高程序性能如出现的事先实例化数据源,初始化部分连接资源使用连接资源时从数据
- maven使用exec插件运行java main方法,以下是3种不同的操作方式。一、从命令行运行1、运行前先编译代码,exec:java不会
- 1. 将对象转换为JSON字符串,返回值为一个JSON字符串public static String toJson(Object value
- 今天整理之前的代码,忽然看到之前自己写的一个刮刮卡,整理下以便以后使用,同时分享给需要的朋友,如有错误,还请多多指正。实现的步骤,其实就是徒
- 1、首先,找到 Android SDK 在本机中的位置,如果不知道,可以通过在 Android Studio 找到,如下:2、其次,通过 c
- 1. 抽象类关键字:abstract类:用来描述一类具体的事物抽象类:抽象的、模糊的、不具体的类在Java的普通类中是不允许多继承的,原因是
- Activiti项目是一项新的基于Apache许可的开源BPM平台,本文就来简述一下Activiti常用类。具体如下:一、为什么要使用工作流
- 项目结构:效果图一:效果图二:效果图三:关于闹钟:Alarm hongten v1.0 使用说明: &nbs
- 简介TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。继承体系TreeMap实现了Map、SortedMap、Navi
- 本文实例讲述了Android编程创建桌面快捷方式的常用方法。分享给大家供大家参考,具体如下:Android在桌面上生成快捷方式有两种情况,一
- 本文实例展示了DevExpress获取TreeList可视区域节点集合的实现方法,是比较有实用价值的技巧。分享给大家供大家参考。具体实现方法