android 开屏广告动画,Android 开屏广告
上一篇说了 ios 的开屏广告,这次把 Android 的也发下。逻辑,界面和 ios一致。
需求:广告不是一成不变,要随时更换图片,上下架时间,以及要启动就展示,需要先存到本地,以及点击跳转等问题。
服务端返回的数据格式
adver = (
{
endtime = 1516622424;
id = 7;
link = "https://www.baidu.com";
pic = "/uploads/image/18/01/5a65608db3ebb.png";
}
);
if (data.has("adver") && data.getJSONArray("adver").length() != 0) {
//有广告字段
JSONObject adJsonObj = data.getJSONArray("adver").getJSONObject(0);
Long endtime = adJsonObj.optLong("endtime") * 1000;
String pic = adJsonObj.getString("pic");
String link = adJsonObj.optString("link");
String str_endtime = endtime + "";
//数据有效性判断
if (StringUtils.isEmpty(str_endtime) || StringUtils.isEmpty(pic)) {
return;
}
if (hasAd()) {
//本地有图片
if (adChanged(pic, str_endtime, link)) {
//是新的图片
SaveAdImage(str_endtime, pic, link);
} else {
//do nothing
}
} else {
//本地没图片
SaveAdImage(str_endtime, pic, link);
}
} else {
removeAd();
//没有广告字段
}
private void SaveAdImage(final String end_time, final String _url, final String link)
{
if (isAdPicDownloading) {
return;
}
isAdPicDownloading = true;
Handler handler = new Handler(Looper.getMainLooper());
// final String path = (AppContext.getAppContext().getExternalCacheDir() != null ? AppContext.getAppContext().getExternalCacheDir() : AppContext.getAppContext().getCacheDir()) + "/" + _url.substring(_url.lastIndexOf("/") + 1);
final String path = FileUtils.getSDCardPath() + "/" + AppContext.getAppContext().getPackageName() + "/" + _url.substring(_url.lastIndexOf("/") + 1);
//如果有上次下载失败有临时文件需要删除之后才能正常下载
if (new File(path).exists()) {
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_ENDTIME, end_time);
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_LINK, link);
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_PIC, path);
return;
}
handler.post(new Runnable()
{
@Override
public void run()
{
mKjh.download(path,
URLs.makeOriginImageUrl(_url), new HttpCallBack()
{
@Override
public void onFailure(int errorNo, String strMsg)
{
super.onFailure(errorNo, strMsg);
}
@Override
public void onFinish()
{
isAdPicDownloading = false;
super.onFinish();
}
@Override
public void onSuccess(byte[] t)
{
super.onSuccess(t);
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_ENDTIME, end_time);
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_LINK, link);
if (!path.equals(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC))) {
removeOldAdFile();
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_PIC, path);
}
}
});
}
});
}
private void removeOldAdFile()
{
String oldPath = PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC);
if (!StringUtils.isEmpty(oldPath)) {
File oldFile = new File(oldPath);
if (oldFile.exists()) {
oldFile.delete();
}
}
}
activity_start.xml
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/iv_ad_app_start"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
android:scaleType="centerCrop"
android:visibility="gone">
android:id="@+id/ll_ad_jump"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="right"
android:layout_marginRight="@dimen/space_15"
android:layout_marginTop="@dimen/space_15"
android:background="@drawable/btn_ad_jump"
android:gravity="center"
android:visibility="gone">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/space_10"
android:layout_marginRight="@dimen/space_2"
android:text="跳过"
android:textColor="@color/white"
android:textSize="@dimen/font_size_15"/>
android:id="@+id/tv_count_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/space_2"
android:layout_marginRight="@dimen/space_10"
android:text="3"
android:textColor="#ff9900"
android:textSize="@dimen/font_size_15"/>
android:id="@+id/ll_default_app_start"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/screen_bg"
android:orientation="vertical"
android:visibility="gone">
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="bottom|center">
android:id="@+id/img_start"
android:layout_width="188dp"
android:layout_height="61dp"
android:layout_marginBottom="@dimen/space_30"
android:scaleType="fitXY"
android:src="@drawable/screen"/>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="bottom"
android:layout_marginBottom="@dimen/space_10"
android:layout_weight="1"
android:gravity="bottom|center"
android:text="@string/at365"
android:textColor="@color/screen_text_color"
android:textSize="@dimen/font_size_12"/>
@BindView(id = R.id.iv_ad_app_start)
ImageView ivAdAppStart;
@BindView(id = R.id.ll_default_app_start)
LinearLayout llDefaultAppStart;
@BindView(id = R.id.tv_count_down)
TextView tvCountDown;
@BindView(id = R.id.ll_ad_jump)
LinearLayout llAdJump;
@BindView(id = R.id.img_start)
private ImageView mImageView;
private void showAdAppStartView()
{
llDefaultAppStart.setVisibility(View.GONE);
final String path = PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC);
final String link = PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_LINK);
AppContext.getAppContext().getKjBitmap().display(ivAdAppStart, path, DensityUtils.getScreenW(AppContext.getAppContext()), DensityUtils.getScreenH(AppContext.getAppContext()), null, null,
new BitmapCallBack()
{
@Override
public void onSuccess(Bitmap bitmap)
{
ivAdAppStart.setVisibility(View.VISIBLE);
llAdJump.setVisibility(View.VISIBLE);
final CountDownTimer countDownTimer = new CountDownTimer(3200, 1000)
{
@Override
public void onTick(long millisUntilFinished)
{
tvCountDown.setText((millisUntilFinished) / 1000 + "");
}
@Override
public void onFinish()
{
tvCountDown.setText("0");
redirectTo();
}
}.start();
llAdJump.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
countDownTimer.cancel();
redirectTo();
}
});
ivAdAppStart.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (!StringUtils.isEmpty(link)) {
countDownTimer.cancel();
browserPath = link;
curMode = luchModeBrowser;
redirectTo();
}
}
});
super.onFinish();
super.onSuccess(bitmap);
}
@Override
public void onFailure(Exception e)
{
removeAd();
startDefaultAppStartView();
super.onFailure(e);
}
@Override
public void onFinish()
{
}
});
// timer.schedule(new TimerTask() {
// @Override
// public void run() {
// }
// }, 3 * 1000, 1000);
}
private void removeAd()
{
File file = new File(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC));
if (file.exists()) {
file.delete();
}
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_ENDTIME, "");
PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC, "");
}
private void startDefaultAppStartView()
{
ivAdAppStart.setVisibility(View.GONE);
llDefaultAppStart.setVisibility(View.VISIBLE);
Animation animation = AnimationUtils.loadAnimation(this,
R.anim.splash_start);
// 监听动画过程
animation.setAnimationListener(new AnimationListener()
{
@Override
public void onAnimationStart(Animation animation)
{
}
@Override
public void onAnimationRepeat(Animation animation)
{
}
@Override
public void onAnimationEnd(Animation animation)
{
redirectTo();
}
});
mImageView.setAnimation(animation);
}
private boolean hasAd()
{
return !StringUtils.isEmpty(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_ENDTIME)) && !StringUtils.isEmpty(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC));
}
这段 android 是我之前同事写的,个人感觉写的烂透了,时间容许我会给重构成 demo。先这样吧。。
android 开屏广告动画,Android 开屏广告相关推荐
- android 指示器平移动画,Android实现带指示器的自动轮播式ViewPager
前言 最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子view,每个一段时间便自动滑动到下一个item view ...
- android 图片查看动画,Android 共享动画实现点击列表图片跳转查看大图页面
主要内容使用系统提供的 API 实现共享动画 在实现过程中遇到的问题图片点击和关闭之后会出现短暂的黑屏问题实现的动画效果如下: 共享动画.gif 具体实现这个效果是在两个页面之间的切换动画,既然是两个 ...
- Android实现蝴蝶动画,Android中的动画具体解释系列——飞舞的蝴蝶
这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...
- android 上下扫描动画,Android扫描雷达动画
很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...
- android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画
android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...
- android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制
之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...
- android 自定义帧动画,Android 自定义方式实现帧动画效果
前言 首先说下为啥要通过自定义处理的方式去实现Android的帧动画效果,因为通过系统原生支持的xml和java代码这两种方式实现,在播放的图片量很多时,会出现内存溢出,此现象也是在做项目当中有遇到, ...
- android程序启动动画,Android设置软件启动动画(以及初次安装的几张引导图)
Android设置软件启动动画(以及初次安装的几张引导图) 设置软件启动动画 1 创建一个启动Activity 这里叫做QiDongActivity 它的XML中设置一个matchparent的背景图 ...
- Android自动伸展动画,android – 如何实现平滑的展开/折叠动画
我指的是在这里找到的扩展/折叠动画代码. 虽然这样做不好,动画不顺利. 我做一些登录代码. public static void expand(final View v) { v.measure(Me ...
最新文章
- 性能加速最高可达28倍!这个NLP工具包太NB了!
- android加载时二级联动点击二级联动,Android实现联动下拉框二级地市联动下拉框功能...
- WEB渗透之对于开了3389远程连接不上的总结
- android开发中,可能会导致内存泄露的问题
- 【数据结构】排序相关题目及各种排序方法的总结
- MFC+GDI+绘制出雷达余晖效果
- 精解闪电网络如何打开BTC支付时代 | 火星总编时刻No.7
- UART RS232 RS485协议原理及应用
- omni的 osx86 ati 驱动
- xp计算机用户名和密码忘记了怎么办,xp电脑开机密码忘记了怎么办,xp忘记开机密码的解决方法...
- android电视,手机控制,Android手机遥控电视:智能语音控制节目
- python-Selenium
- 启动计算机按住del不放,电脑开机需要按del进入系统怎么办
- 多少人败给了一个字:等 ! 宋丹丹、梁静茹、张国荣。。。
- js+html+css+jQuery实现简单购物车
- gitlab编译安装史----虽败犹荣
- 关于Anaconda Navigator卡在Adding Featured Channels的解决办法
- 鲁大师发布2021年半年报,哪些手机最强?
- 【转】Linux那些事儿之我是U盘(4)想到达明天,现在就要启程
- skimage.feature--corner_harris、hog、local_binary_pattern说明
热门文章
- 基于MATLAB的运动模糊图像恢复技术
- 增量式与绝对值编码器的区别
- 在CentOS8.4中安装OpenFOAM
- 魅族手机投屏电脑如何操作
- 董事长和总经理的最大区别
- 公司法定代表人通常由谁担任?
- 华为p4不是鸿蒙吗怎么又改为安卓_华为已将“基于安卓10”变成“兼容安卓10”,EMUI就是鸿蒙OS...
- Maximo 人员- 应用程序导入,公共操作怎么配置,求大神指点,万分感谢
- 谷歌浏览器翻译显示服务器失败,谷歌浏览器翻译失败的解决办法 来看看吧
- 免费的云数据库平台Planetscale