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

本文实例为大家分享了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的值即可。

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

(0)

相关推荐

  • Android监听输入法弹窗和关闭的实现方法

    用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?本篇文章就为你提供了一种可靠的实现方式. 演示效果视频地址 首先在AndroidManifest中配置 android:windowSoftInputMode="adjustResize" 这样每次输入法弹出和关闭都会重新计算高度实现把布局顶上去的效果 然后我们要自定义一个布局,监听布局大小变化 public class CheckSoftInputLayout exten

  • Android程序开发仿新版QQ锁屏下弹窗功能

    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是View QQ的弹窗一开始我以为是悬浮View,用WindowManager去添加,但是无论如何就是不显示,后来在朋友提示下换成Activity来实现,在锁屏状态下就能弹窗了. 2.Activity的设置 Activity需要进行以下设置,才可以在锁屏状态下弹窗. 首先是onCreate方法,需要添加

  • Android屏幕锁屏弹窗的正确姿势DEMO详解

    在上篇文章给大家介绍了Android程序开发仿新版QQ锁屏下弹窗功能.今天通过本文给大家分享android锁屏弹窗的正确姿势. 最近在做一个关于屏幕锁屏悬浮窗的功能,于是在网上搜索了很多安卓屏幕锁屏的相关资料,鉴于网上的资料比较零碎,所以我在这里进行整理总结.本文将从以下两点对屏幕锁屏进行解析: 1. 如何监听系统屏幕锁屏 2. 如何在锁屏界面弹出悬浮窗 如何监听系统屏幕锁屏 经过总结,监听系统的锁屏可以通过以下两种方式: 1) 代码直接判定 2) 接收广播 1) 代码直接判定 代码判断方式,也

  • Android仿支付宝微信支付密码界面弹窗封装dialog

    一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外框是用的一个有stroke属性的shape, (2),1-9数字是用的recycleview ,每个item的底部和右边有1dp的黑线,填充后形成分割线. (3),recycleview 要设置属性  android:overScrollMode=&quo

  • Android实现气泡布局/弹窗效果 气泡尖角方向及偏移量可控

    Android 自定义布局实现气泡弹窗,可控制气泡尖角方向及偏移量. 效果图 实现 首先自定义一个气泡布局. /** * 气泡布局 */ public class BubbleRelativeLayout extends RelativeLayout { /** * 气泡尖角方向 */ public enum BubbleLegOrientation { TOP, LEFT, RIGHT, BOTTOM, NONE } public static int PADDING = 30; public

  • Android UI设计之AlertDialog弹窗控件

    有关android的弹窗界面相信大家见过不少了,手机上很多应用软件都涉及到弹窗控件,比如典型的每次删除一个图片或者卸载一个等都会弹出一个窗口询问是否删除/卸载等,还有我们系统的设置时间/日期等,都用到了这样的控件,下面我将通过代码来总结下常用的几个弹窗控件 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

  • Android控件PopupWindow模仿ios底部弹窗

    前言 在H5火热的时代,许多框架都出了底部弹窗的控件,在H5被称为弹出菜单ActionSheet,今天我们也来模仿一个ios的底部弹窗,取材于苹果QQ的选择头像功能. 正文 废话不多说,先来个今天要实现的效果图 整个PopupWindow的开启代码 private void openPopupWindow(View v) { //防止重复按按钮 if (popupWindow != null && popupWindow.isShowing()) { return; } //设置Popup

  • Android仿支付宝支付从底部弹窗效果

    我们再用支付宝支付的时候,会从底部弹上来一个对话框,让我们选择支付方式等等,今天我们就来慢慢实现这个功能 效果图 实现 主界面很简单,就是一个按钮,点击后跳到支付详情的Fragment中 package com.example.hfs.alipayuidemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.wi

  • Android如何实现锁屏状态下弹窗

    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗口显示在锁屏的上面. 接下来就是试验可能相关的 Window Type 属性,验证该方案是否可行. 在尝试各个 Window Type 属性之前需要明确各个 Type 所需要的权限,下面是 com.android.internal.policy.impl.PhoneWindowManager.checkAddPermission 的源码: publi

  • Android自定义带增长动画和点击弹窗提示效果的柱状图DEMO

    项目中最近用到各种图表,本来打算用第三方的,例如MPAndroid,这是一个十分强大的图表库,应用起来十分方便,但是最终发现和设计不太一样,没办法,只能自己写了.今天将写好的柱状图的demo贴在这,该柱状图可根据数据的功能有一下几点: 1. 根据数据的多少,动态的绘制柱状图柱子的条数: 2. 柱状图每条柱子的绘制都有动态的动画效果: 3. 每条柱子有点击事件,点击时弹出提示框,显示相关信息,规定时间后,弹窗自动消失. 好了,先上演示图: 下边贴出相关代码: 自定义柱状图类: package co

随机推荐