Android实现自适应屏幕的弹窗广告

所属分类: 软件编程 / Android 阅读数: 51
收藏 0 赞 0 分享

本文实例为大家分享了Android实现弹窗广告的具体代码,供大家参考,具体内容如下

内容:弹窗广告

特点:根据屏幕尺寸和原图片比例自适应

代码如下:

package com.example.leixiansheng.addialog;
 
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
 
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
 
/**
 * Created by Leixiansheng on 2018/6/28.
 */
 
public class AdDialog extends Dialog implements View.OnClickListener {
 
 private Context context;
 private float finalWidth; //最终宽度
 private float finalHeight; //最终高度
 private int padding = 50; //屏幕边距间隔
 private int picWidth; //图片真实宽度
 private int picHeight; //图片真实高度
 private String mUrl;
 
 
 public AdDialog(Context context,String url) {
 // 更改样式,把背景设置为透明的
 super(context, R.style.LocationDialogStyle);
 this.context = context;
 mUrl = url;
 }
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 setContentView(R.layout.dialog_ad);
 
 calculateHeightAndWidth();
 
 //初始化布局的位置
 initLayoutParams();
 setCancelable(false);
 setCanceledOnTouchOutside(false);
 }
 
 /**
 * 按实际图片比例对其的宽高进行缩放
 */
 private void calculateHeightAndWidth() {
 DisplayMetrics dm = context.getResources().getDisplayMetrics();
 final int screenWidth = dm.widthPixels;
 final int screenHeight = dm.heightPixels;
 
 //获取图片真正的宽高
 Glide.with(context)
  .load(mUrl)
  .asBitmap()//强制Glide返回一个Bitmap对象
  .into(new SimpleTarget<Bitmap>() {
   @Override
   public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) {
   picWidth = bitmap.getWidth();
   picHeight = bitmap.getHeight();
 
   if (picHeight > picWidth) {
    //真实图片高度大于宽度时
    finalHeight = screenHeight - padding * 2;
    finalWidth = ((picWidth * 100) / picHeight) * finalHeight/100;
   } else {
    //真实图片宽度大于高度时
    finalWidth = screenWidth - padding * 2;
    finalHeight = ((picHeight * 100) / picWidth) * finalWidth/100;
   }
   if ((int) finalWidth > screenWidth || (int) finalHeight > screenHeight) {
    //放大后的比例超出屏幕时
    finalWidth = picWidth;
    finalHeight = picHeight;
   }
   initAdView(finalWidth, finalHeight);
   }
  });
 }
 
 @SuppressLint("ResourceType")
 private void initAdView(float width, float height) {
 RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.rl_ad);
 ImageView ivAd = new ImageView(context);
 ivAd.setScaleType(ImageView.ScaleType.FIT_XY);
 ivAd.setId(222);
 ivAd.setOnClickListener(this);
// RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(UIUtils.px2Dp((int) width), UIUtils.px2Dp((int) height));
 RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams((int) width, (int) height);
 params1.addRule(RelativeLayout.CENTER_HORIZONTAL);
 params1.setMargins(0, dp2Px(50), 0, 0);
 relativeLayout.addView(ivAd, params1);
 
 Glide
  .with(context)
  .load(mUrl)
  .crossFade()
  .into(ivAd);
 
 ImageView ivCancel = new ImageView(context);
 ivCancel.setId(333);
 ivCancel.setOnClickListener(this);
 ivCancel.setImageResource(R.drawable.icon_ad_close);
 RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(dp2Px(30), dp2Px(30));
 params2.addRule(RelativeLayout.ALIGN_PARENT_TOP);
 params2.addRule(RelativeLayout.ALIGN_END,222);
 relativeLayout.addView(ivCancel,params2);
 }
 
 // 初始化布局的参数
 private void initLayoutParams() {
 // 布局的参数
 WindowManager.LayoutParams params = getWindow().getAttributes();
 params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER;
 getWindow().setAttributes(params);
 }
 
 @Override
 public void onClick(View v) {
 switch (v.getId()) {
  case 222:
  Toast.makeText(context, "你点击了广告,即将进入···",Toast.LENGTH_SHORT).show();
  dismiss();
  break;
  case 333:
  dismiss();
  break;
 }
 }
 
 public int dp2Px(int dp){
    /*
    1、px = dp * (dpi / 160)
    2、px/dp = density;//像素密度比
    */
 DisplayMetrics metrics = context.getResources().getDisplayMetrics();
//    int dpi = metrics.densityDpi;//获得当前设备的dpi ,像素密度
 float density = metrics.density;//密度比
 return (int) (density * dp + .5f);
 }
}

动态布局可参考我的文章:安卓动态布局

Main

package com.example.leixiansheng.addialog;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
 
import java.util.Random;
 
public class MainActivity extends AppCompatActivity {
 
 private String[] adUrls = {"http://pic17.photophoto.cn/20101028/0017029521232265_b.jpg",
  "http://pic.58pic.com/58pic/13/56/51/95K58PICPFk_1024.jpg",
  "http://img5.imgtn.bdimg.com/it/u=1615585387,2628665620&fm=27&gp=0.jpg",
  "http://img1.imgtn.bdimg.com/it/u=1306190881,4135880992&fm=27&gp=0.jpg"};
 
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 randomAd();
 new AdDialog(this, randomAd()).show();
 }
 
 private String randomAd() {
 int i = (int) (Math.random() * (adUrls.length)); // 0 到 3 随机生成
 return adUrls[i];
 }
}

PS:当真实图片长度大于宽度时,图片可能距屏幕上方过近,自己修改padding值,或者增加setMargins的值即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享

TextView显示系统时间(时钟功能带秒针变化

用System.currentTimeMillis()可以获取系统当前的时间,我们可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示的系统时间,可以做一个时钟的功能
收藏 0 赞 0 分享

Android用ListView显示SDCard文件列表的小例子

本文简单实现了用ListView显示SDCard文件列表,目录的回退等功能暂不讨论,获取文件列表,files即为所选择目录下的所有文件列表
收藏 0 赞 0 分享

Android拦截外拨电话程序示例

这篇文章主要介绍了Android拦截外拨电话的示例,大家参考使用吧
收藏 0 赞 0 分享

通过Html网页调用本地安卓(android)app程序代码

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式
收藏 0 赞 0 分享

android Textview文字监控(Textview使用方法)

以手机号充值为例,当用户输入最后一位数时候,进行汇率的变换,本文就实现类似这样的功能
收藏 0 赞 0 分享

Android ListView长按弹出菜单二种实现方式示例

这篇文章主要介绍了Android ListView长按弹出菜单的方法,大家参考实现
收藏 0 赞 0 分享
查看更多