弹窗广告android开发_android开发 360弹窗广告提示报毒 - CSDN
  • android 弹出一个广告

    2016-12-09 18:48:49
    转载:QGlaunch 布局文件代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_... android:layou

    转载:QGlaunch


    布局文件代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" >
    
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
    
            <ImageView
                android:id="@+id/start_img"
                android:layout_width="213dp"
                android:layout_height="320dp"
                android:scaleType="fitXY"
                android:layout_gravity="center"
                android:background="@android:color/transparent"
                android:src="@drawable/images"
                android:paddingRight="7dp"
                android:paddingTop="7dp" />
    
            <Button
                android:id="@+id/btn_close"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="95dp"
                android:background="@drawable/search_new_shopping_cart_num_bg"
                />
        </FrameLayout>
    
    </LinearLayout>

    关键代码如下:

    Context context = MainActivity.this;
    		dia = new Dialog(context, R.style.edit_AlertDialog_style);
    		dia.setContentView(R.layout.activity_start_dialog);
    
    		Button mClose_btn = (Button) dia.findViewById(R.id.btn_close);
    		mClose_btn.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				dia.cancel();// 关闭弹出框
    			}
    		});
    		dia.show();
    
    		dia.setCanceledOnTouchOutside(false); // Sets whether this dialog is
    												// canceled when touched outside
    												// the window's bounds.
    		Window w = dia.getWindow();
    		WindowManager.LayoutParams lp = w.getAttributes();
    		lp.x = 0;
    		lp.y = 40;
    		dia.onWindowAttributesChanged(lp);


    展开全文
  • 不少App在打开的时候需要弹出一个广告活动弹窗,点击广告活动弹窗中的图片就会跳转到一个H5页面,加载显示具体的活动内容等,为了方便大家的操作,我将其做成了一个标准控件:android-adDialog。需要说明的是,虽然...

    转载请标明出处:一片枫叶的专栏

    上一篇文章中讲解了我最近写的一个快速集成二维码扫描库,其核心的实现扫描的功能,是通过调用ZXing库实现的。由于在实现二维码扫描功能的时候发现集成二维码扫描功能并不是特别方便,于是有了将其制作成标准库的想法,这个二维码库能够快速,方便的集成二维码扫描功能,项目地址是在:android-zxingLibrary**,在项目开源后有不少同学提出了许多不错的意见,目前也在不断的迭代中,自己也学到了很多。

    本文我们将讲解一个简单,强大的广告活动弹窗控件。不少App在打开的时候需要弹出一个广告活动弹窗,点击广告活动弹窗中的图片就会跳转到一个H5页面,加载显示具体的活动内容等,为了方便大家的操作,我将其做成了一个标准控件:android-adDialog。需要说明的是,虽然其名称为android-adDialog,并且表现形式也和Dialog类似,但是这里并不是通过Dialog实现的,而是自定义的View。

    本项目的github地址:android-adDialog,欢迎star和follow。

    在介绍具体的使用说明之前,我们先看一下简单的实现效果:
    这里写图片描述

    使用说明

    • 显示一个默认广告弹窗,支持单广告活动、多广告活动,当弹窗显示多广告是默认显示底部小圆圈,当显示单活动时默认不显示底部小圆圈;

    • 默认支持弹窗从上,下,左,右,左上,右上,左下,右下等八个方向弹出,更可以设置从任意指定的角度(0-360)弹出;

    • 默认继承了弹性动画效果,可以设定弹性动画弹性参数,动画速度等;

    • 支持对弹窗背景透明色的更改,支持对弹窗透明,支持设置弹窗背景全屏显示或者是只在内容区域显示;

    • 支持设定弹窗宽高比,支持设置弹窗距离屏幕两侧距离,支持设置关闭按钮是否显示;

    • 支持对关闭按钮点击事件的回调,对每一项广告活动点击事件的回调等;

    • 支持对ViewPager滑动动画效果的设定,支持自定义ViewPager滑动动画效果;

    API说明:

    所有的设置参数均返回AdManager对象,所以可以直接链式调用。

    AdManager adManager = new AdManager(MainActivity.this, advList);
    aDMamager.
    /**
     * 设置弹窗背景全屏显示还是在内容区域显示
     */
    .setOverScreen(true)
    /**
     * 设置ViewPager的滑动动画
     */
    .setPageTransformer(new DepthPageTransformer())
    /**
     * 设置弹窗距离屏幕两侧的距离(单位dp)
     */
    .setPadding(100)
    /**
     * 设置弹窗的宽高比
     */
    .setWidthPerHeight(0.75f)
    /**
     * 设置弹窗的背景色(当弹窗背景设置透明时,此设置失效)
     */
    .setBackViewColor(Color.parseColor("#AA333333"))
    /**
     * 设置弹窗背景是否透明
     */
    .setAnimBackViewTransparent(true)
    /**
     * 设置弹窗关闭图标是否可见
     */
    .setDialogCloseable(false)
    /**
     * 设置弹窗弹性滑动弹性值
     */
    .setBounciness(15)
    /**
     * 设置弹窗弹性滑动速度值
     */
    .setSpeed(5)
    /**
     * 设定弹窗点击事件回调
     */
    .setOnImageClickListener(new AdManager.OnImageClickListener() {})
    /**
     * 设定关闭按钮点击事件回调
     */
    .setOnCliseClickListener(new OnClickListener() {})
    /**
     * 开始执行弹窗的显示操作,可传值为0-360,0表示从右开始弹出,逆时针方向,也可以传入自定义的方向值
     */
    .showAdDialog(AdConstant.ANIM_UP_TO_DOWN)

    使用方式:

    • 在module的build.gradle中执行compile操作
    compile 'cn.yipianfengye.android:ad-library:1.0'
    • 在代码中初始化数据
    /**
         * 初始化数据
         */
        private void initData() {
            advList = new ArrayList<>();
            AdInfo adInfo = new AdInfo();
            adInfo.setActivityImg("https://raw.githubusercontent.com/yipianfengye/android-adDialog/master/images/testImage1.png");
            advList.add(adInfo);
    
            adInfo = new AdInfo();
            adInfo.setActivityImg("https://raw.githubusercontent.com/yipianfengye/android-adDialog/master/images/testImage2.png");
            advList.add(adInfo);
        }

    这里只要是初始化图片的UI地址信息,方便我们的后续下载操作。

    • 执行弹窗的初始化与现实操作
    /**
     * 创建广告活动管理对象
     */
    AdManager adManager = new AdManager(MainActivity.this, advList);
    adManager.setOverScreen(true)
             .setPageTransformer(new DepthPageTransformer());
    /**
     * 执行弹窗的显示操作
     */
    adManager.showAdDialog(AdConstant.ANIM_DOWN_TO_UP);

    怎么样是不是很简单?下面我们可以来看一下具体API。

    具体的API说明:

    • (1)自定义的弹窗弹出方向API

    在执行AdManager的showAdDialog方法时,需要传递一个int型的animType参数,我们默认定义了八个该类型的参数,默认如下:

    // ####################### 弹出动画效果 ###########################
        /**
         * 广告活动弹窗动画-从上至下
         */
        public static final int ANIM_UP_TO_DOWN = -11;
        /**
         * 广告活动弹窗动画-从下至上
         */
        public static final int ANIM_DOWN_TO_UP = -12;
        /**
         * 广告活动弹窗动画-从左至右
         */
        public static final int ANIM_LEFT_TO_RIGHT = -13;
        /**
         * 广告活动弹窗动画-从右至左
         */
        public static final int ANIM_RIGHT_TO_LEFT = -14;
        /**
         * 广告活动弹窗动画-从左上弹出
         */
        public static final int ANIM_UPLEFT_TO_CENTER = -15;
        /**
         * 广告活动弹窗动画-从右上弹出
         */
        public static final int ANIM_UPRIGHT_TO_CENTER = -16;
        /**
         * 广告活动弹窗动画-从左下弹出
         */
        public static final int ANIM_DOWNLEFT_TO_CENTER = -17;
        /**
         * 广告活动弹窗动画-从右下弹出
         */
        public static final int ANIM_DOWNRIGHT_TO_CENTER = -18;

    好吧,如果你觉得还不够好,我想让弹窗从右上侧30度角的弹出可以么?这也是支持的,只需要你传递的int型的animType的时候传递30就好了,如下:

    /**
     * 执行弹窗的显示操作(参数的范围:0-360,0表示从右侧弹出,逆时针旋转)
     */
    adManager.showAdDialog(30);

    那么我们看一下执行效果呢:

    这里写图片描述

    • (2)自定义弹窗距离屏幕两侧的距离以及弹窗的宽高比:
    /**
             * 自定义设置广告活动弹窗距离屏幕两侧距离以及宽高比
             */
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AdManager adManager = new AdManager(MainActivity.this, advList);
    
                    adManager.setOnImageClickListener(new AdManager.OnImageClickListener() {
                        @Override
                        public void onImageClick(View view, AdInfo advInfo) {
                            Toast.makeText(MainActivity.this, "您点击了ViewPagerItem...", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setPadding(100)
                    .setWidthPerHeight(0.5f)
                    .showAdDialog(AdConstant.ANIM_UP_TO_DOWN);
                }
            });

    然后我们看一下执行效果:

    这里写图片描述

    怎么样?是不是发现弹窗的宽高比和距离屏幕两侧的距离发生了变化?

    • (3)自定义背景颜色,自定义弹窗是否覆盖全屏,关闭按钮是否显示
    /**
             * 自定义弹窗背景颜色,弹窗是否覆盖全屏,关闭按钮是否显示等
             */
            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AdManager adManager = new AdManager(MainActivity.this, advList);
    
                    adManager.setOnImageClickListener(new AdManager.OnImageClickListener() {
                        @Override
                        public void onImageClick(View view, AdInfo advInfo) {
                            Toast.makeText(MainActivity.this, "您点击了ViewPagerItem...", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setBackViewColor(Color.parseColor("#AA333333"))
                    .setDialogCloseable(false)
                    .showAdDialog(AdConstant.ANIM_UP_TO_DOWN);
                }
            });

    然后我们来看一下具体的实现效果:

    这里写图片描述

    可以看到我们更改了弹窗的背景颜色以及未显示关闭按钮

    • (4)自定义设置弹性动画弹性参数和速度参数
    /**
             * 自定义设定弹窗弹性参数和速度参数
             */
            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AdManager adManager = new AdManager(MainActivity.this, advList);
    
                    adManager.setOnImageClickListener(new AdManager.OnImageClickListener() {
                        @Override
                        public void onImageClick(View view, AdInfo advInfo) {
                            Toast.makeText(MainActivity.this, "您点击了ViewPagerItem...", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setBounciness(20)
                    .setSpeed(4)
                    .showAdDialog(AdConstant.ANIM_UP_TO_DOWN);
                }
            });

    然后我们看一下动画效果:
    这里写图片描述

    为了明显的展示出动画效果,我们设置的弹性参数和速度参数比较大,是不是比较出来了这两个参数的作用?

    • (5)自定义设置弹窗ViewPager滑动动画:
    /**
             * 自定义设置弹窗ViewPager滑动动画
             */
            button5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AdManager adManager = new AdManager(MainActivity.this, advList);
    
                    adManager.setOnImageClickListener(new AdManager.OnImageClickListener() {
                        @Override
                        public void onImageClick(View view, AdInfo advInfo) {
                            Toast.makeText(MainActivity.this, "您点击了ViewPagerItem...", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setPageTransformer(new RotateDownPageTransformer())
                    .showAdDialog(AdConstant.ANIM_UP_TO_DOWN);
                }
            });

    然后我们看一下弹窗的滑动动画:

    这里写图片描述

    这里我内置了三种ViewPager的滑动动画效果:

    DepthPageTransformer;
    RotateDownPageTransformer;
    ZoomOutPageTransformer;

    我们还可以自定义实现:PageTransformer自定义出自己的滑动动画效果,更多关于PageTransformer的知识,可参考鸿洋大神的: Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)

    • (6)自定义关闭按钮点击事件回调,ViewPagerItem点击事件回调
    /**
             * 自定义设置弹窗ViewPagerItem点击事件,关闭按钮点击事件回调
             */
            button6.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AdManager adManager = new AdManager(MainActivity.this, advList);
    
                    adManager.setOnImageClickListener(new AdManager.OnImageClickListener() {
                        @Override
                        public void onImageClick(View view, AdInfo advInfo) {
                            Toast.makeText(MainActivity.this, "您点击了ViewPagerItem...", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setOnCloseClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    Toast.makeText(MainActivity.this, "您点击了关闭按钮...", Toast.LENGTH_SHORT).show();
                                }
                            })
                    .showAdDialog(AdConstant.ANIM_UP_TO_DOWN);
                }
            });

    好吧,以上就是广告活动弹窗的API,除了以上还可以添加其他的一些API,欢迎提出。

    自定义广告活动弹窗的实现过程:

    • 自定义广告弹窗对象

    主要用于管理自定义View,ViewPager等对象;这里我们可以看一下弹窗展示方法的实现:

    /**
         * 开始执行显示广告弹窗的操作
         * @param animType
         */
        public void showAdDialog(final int animType) {
    
            contentView = LayoutInflater.from(context).inflate(R.layout.ad_dialog_content_layout, null);
            adRootContent = (RelativeLayout) contentView.findViewById(R.id.ad_root_content);
    
            viewPager = (ViewPager) contentView.findViewById(R.id.viewPager);
            mIndicator = (FlycoPageIndicaor) contentView.findViewById(R.id.indicator);
    
            adAdapter = new AdAdapter();
            viewPager.setAdapter(adAdapter);
    
            if (pageTransformer != null) {
                viewPager.setPageTransformer(true, pageTransformer);
            }
    
            mIndicator.setViewPager(viewPager);
            isShowIndicator();
    
            animDialogUtils = AnimDialogUtils.getInstance(context)
                    .setAnimBackViewTransparent(isAnimBackViewTransparent)
                    .setDialogCloseable(isDialogCloseable)
                    .setDialogBackViewColor(backViewColor)
                    .setOnCloseClickListener(onCloseClickListener)
                    .setOverScreen(isOverScreen)
                    .initView(contentView);
            setRootContainerHeight();
    
            // 延迟1s展示,为了避免ImageLoader还为加载完缓存图片时就展示了弹窗的情况
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    animDialogUtils.show(animType, bounciness, speed);
                }
            }, 1000);
        }
    • 自定义弹窗对象

    在广告活动弹窗对象中我们调用了:

    AnimDialogUtils.getInstance(context)
                    .setAnimBackViewTransparent(isAnimBackViewTransparent)
                    .setDialogCloseable(isDialogCloseable)
                    .setDialogBackViewColor(backViewColor)
                    .setOnCloseClickListener(onCloseClickListener)
                    .setOverScreen(isOverScreen)
                    .initView(contentView);

    而这里的AnimDialogUtils主要用于实现类似Dialog的效果,这里我们看一下自定义弹窗展示方法的具体实现:

    /**
         * 初始化弹窗中的界面,添加传入的customView界面,并监听关闭按钮点击事件
         *
         * @param customView
         * @return
         */
        public AnimDialogUtils initView(final View customView) {
            if (isOverScreen) {
                androidContentView = (ViewGroup) context.getWindow().getDecorView();
            } else {
                androidContentView = (ViewGroup) context.getWindow().findViewById(Window.ID_ANDROID_CONTENT);
            }
            rootView = LayoutInflater.from(context).inflate(R.layout.anim_dialog_layout, null);
            rootView.setTag(ANIM_DIALOG_TAG);
    
            animBackView = (RelativeLayout) rootView.findViewById(R.id.anim_back_view);
            animContainer = (RelativeLayout) rootView.findViewById(R.id.anim_container);
            animContainer.setVisibility(View.INVISIBLE);
            flContentContainer = (FrameLayout) rootView.findViewById(R.id.fl_content_container);
            ViewGroup.LayoutParams contentParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            flContentContainer.addView(customView, contentParams);
            ivClose = (ImageView) rootView.findViewById(R.id.iv_close);
    
    
            return this;
        }
    
        /**
         * 开始执行弹窗的展示动画
         * @param animType
         */
        public void show(int animType, double bounciness, double speed) {
            // 判断是否设置背景透明
            if (isAnimBackViewTransparent) {
                backViewColor = Color.TRANSPARENT;
            }
            // 判断背景颜色
            animBackView.setBackgroundColor(backViewColor);
    
            // 判断弹窗是否可关闭
            if (isDialogCloseable) {
                ivClose.setVisibility(View.VISIBLE);
                ivClose.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (onCloseClickListener != null) {
                            onCloseClickListener.onClick(view);
                        }
                        dismiss(AdConstant.ANIM_STOP_TRANSPARENT);
                    }
                });
            } else {
                ivClose.setVisibility(View.GONE);
            }
            ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            androidContentView.addView(rootView, params);
            AnimSpring.getInstance().startAnim(animType, animContainer, bounciness, speed);
            isShowing = true;
        }
    • 自定义弹性滑动工具类

    在上面的弹窗展示方法中我们最终调用了:

    AnimSpring.getInstance().startAnim(animType, animContainer, bounciness, speed);

    在实现弹窗的弹性滑动过程中使用了Facebook的rebound框架,自定义了一个弹性滑动工具类,在其中初始化rebound的SpringSystem对象,并实现了弹窗的各个角度的弹性滑动效果:

    /**
         * 开始动画-定义动画开始角度
         * @param animType
         * @param animContainer
         */
        public void startCircleAnim(final int animType, final RelativeLayout animContainer) {
            double radius = Math.sqrt(DisplayUtil.screenhightPx * DisplayUtil.screenhightPx + DisplayUtil.screenWidthPx * DisplayUtil.screenWidthPx);
            double heightY = - Math.sin(Math.toRadians(animType)) * radius;
            double widthX = Math.cos(Math.toRadians(animType)) * radius;
    
            Spring tranSpring = springSystem.createSpring();
            Spring tranSpring1 = springSystem.createSpring();
            tranSpring.addListener(new SimpleSpringListener() {
                @Override
                public void onSpringActivate(Spring spring) {
                    animContainer.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onSpringUpdate(Spring spring) {
                    animContainer.setTranslationX((float) spring.getCurrentValue());
                }
            });
    
            tranSpring1.addListener(new SimpleSpringListener() {
                @Override
                public void onSpringActivate(Spring spring) {
                    animContainer.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onSpringUpdate(Spring spring) {
                    animContainer.setTranslationY((float) spring.getCurrentValue());
                }
            });
    
            tranSpring.setSpringConfig(springConfig);
            tranSpring1.setSpringConfig(springConfig);
            tranSpring.setCurrentValue(widthX);
            tranSpring.setEndValue(0);
            tranSpring1.setCurrentValue(heightY);
            tranSpring1.setEndValue(0);
        }

    这样就实现了对弹窗的初始化,展示,动画效果的实现等操作。

    • 使用Fresco实现图片的下载操作

    在我们的ViewPager初始化图片的时候是通过Fresco类库实现对图片URL的下载操作的:

    @Override
            public Object instantiateItem(ViewGroup container, int position) {
                /**
                 * 初始化ViewPager Item内容
                 */
                AdInfo advInfo = advInfoListList.get(position);
    
                View rootView = context.getLayoutInflater().inflate(R.layout.viewpager_item, null);
                final ViewGroup errorView = (ViewGroup) rootView.findViewById(R.id.error_view);
                final ViewGroup loadingView = (ViewGroup) rootView.findViewById(R.id.loading_view);
                final SimpleDraweeView simpleDraweeView = (SimpleDraweeView) rootView.findViewById(R.id.simpleDraweeView);
                ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                container.addView(rootView, params);
                simpleDraweeView.setTag(advInfo);
                simpleDraweeView.setOnClickListener(imageOnClickListener);
    
                /**
                 * 监听图片下载动作
                 */
                ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
                    @Override
                    public void onFinalImageSet(
                            String id,
                            @Nullable ImageInfo imageInfo,
                            @Nullable Animatable anim) {
                        if (imageInfo == null) {
                            return;
                        }
                        errorView.setVisibility(View.GONE);
                        loadingView.setVisibility(View.GONE);
                        simpleDraweeView.setVisibility(View.VISIBLE);
                    }
    
                    @Override
                    public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
                        Log.i("##########", "onIntermediateImageSet()");
                    }
    
                    @Override
                    public void onFailure(String id, Throwable throwable) {
                        errorView.setVisibility(View.VISIBLE);
                        loadingView.setVisibility(View.GONE);
                        simpleDraweeView.setVisibility(View.GONE);
                    }
                };
    
                Uri uri = Uri.parse(advInfo.getActivityImg());
                DraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setControllerListener(controllerListener)
                        .setUri(uri)
                        .build();
                simpleDraweeView.setController(controller);
    
                return rootView;
            }

    当然更具体的关于广告活动弹窗控件的实现可以下载源码参考。

    总结:

    以上就是我实现的这个自定义广告活动弹窗控件。其还可以添加一些其他的API,欢迎提出,对于源码有兴趣的同学可以到github上看一下具体实现。项目地址:android-adDialog


    另外对github项目,开源项目解析感兴趣的同学可以参考我的:
    Github项目解析(一)–>上传Android项目至github
    Github项目解析(二)–>将Android项目发布至JCenter代码库
    Github项目解析(三)–>Android内存泄露监测之leakcanary
    Github项目解析(四)–>动态更改TextView的字体大小
    Github项目解析(五)–>Android日志框架
    Github项目解析(六)–>自定义实现ButterKnife框架
    Github项目解析(七)–>防止按钮重复点击
    Github项目解析(八)–>Activity启动过程中获取组件宽高的五种方式
    Github项目解析(九)–>实现Activity跳转动画的五种方式
    Github项目解析(十)–>几行代码快速集成二维码扫描库

    展开全文
  • 一个简单强大的广告活动弹窗控件
  • 转载请注明出处:... 内容:弹窗广告 特点:根据屏幕尺寸和原图片比例自适应 代码如下: package com.example.leixiansheng.addialog; import android.annotation.SuppressLint; impor...

    转载请注明出处:https://blog.csdn.net/mr_leixiansheng/article/details/81062588

    内容:弹窗广告

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

    代码如下:

    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.CENTER_CROP);
    		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的值即可。楼主就偷个懒啦,啊哈哈~~

    展开全文
  • Android--万能自定义弹窗。使用的是AlertDialog自定义弹窗呢,就是一个界面放在了AlertDialog容器弹框上。

    使用的是AlertDialog

    自定义弹窗呢,就是一个界面放在了AlertDialog容器弹框上。

    第一步:写好你的界面 (在layout下创建system_admin_psw_alert_dialog.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fff"
        android:padding="10dp"
        >
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginBottom="10dp"
            >
    
            <ImageView
                android:id="@+id/system_admin_psw_alert_img"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="@drawable/warn"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:text="@string/warning"
                android:textColor="#f00"
                android:textSize="25sp"
                android:layout_marginLeft="6dp"
                android:layout_toRightOf="@+id/system_admin_psw_alert_img"
                />
            <Button
                android:id="@+id/system_admin_psw_alert_close"
                android:layout_width="22dp"
                android:layout_height="22dp"
                android:background="@mipmap/close_icon"
                android:layout_alignParentRight="true"
                />
        </RelativeLayout>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#f00"
            android:textSize="18sp"
            android:padding="8dp"
            android:lineSpacingExtra="8dp"
            android:text="@string/set_debug_info"
            />
    
        <EditText
            android:id="@+id/sap_alert_dialog_edt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
    
            android:maxLength="6"
            android:digits="1234567890"
            android:singleLine="true"
            android:layout_margin="16dp"
            android:hint="请输入主管密码"
            android:textColorHint="#ccc"
            android:textColor="#000"
            android:background="@mipmap/sys_login_psw"
        />
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="10dp"
            >
            <Button
                android:id="@+id/sap_alert_dialog_cancel"
                android:layout_width="wrap_content"
                android:layout_height="34dp"
                android:background="#f00"
                android:text="关闭"
                android:layout_marginLeft="20dp"
                />
            <Button
                android:id="@+id/sap_alert_dialog_ok"
                android:layout_width="wrap_content"
                android:layout_height="34dp"
                android:background="#f00"
                android:text="开启"
                android:layout_alignParentRight="true"
                android:layout_marginRight="20dp"
                />
        </RelativeLayout>
    
    </LinearLayout>
    

    2、在一个Activity界面上设置按钮 然后触发弹框出现
    再触发时间里写 showSetDeBugDialog()方法

     private void showSetDeBugDialog() {
            AlertDialog.Builder setDeBugDialog = new AlertDialog.Builder(this);
            //获取界面
            View dialogView = LayoutInflater.from(this).inflate(R.layout.system_admin_psw_alert_dialog, null);
            //将界面填充到AlertDiaLog容器
            setDeBugDialog.setView(dialogView);
            //初始化控件
            final EditText adminPwd = (EditText) dialogView.findViewById(R.id.sap_alert_dialog_edt);
            Button okButton = (Button) dialogView.findViewById(R.id.sap_alert_dialog_ok);
        //取消点击外部消失弹窗
            setDeBugDialog.setCancelable(false);
            //创建AlertDiaLog
            setDeBugDialog.create();
            //AlertDiaLog显示
            final AlertDialog customAlert = setDeBugDialog.show();
        //设置自定义界面的点击事件逻辑        dialogView.findViewById(R.id.system_admin_psw_alert_close).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    customAlert.dismiss();
                }
            });
            okButton.setOnClickListener(new android.view.View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String str = adminPwd.getText().toString();
                    if (str.equals("888888")) {
                        ToastUtil.toast("开启");
                        editor.putString("univ_set_debug", "1");
                        editor.apply();
                        setDebugbtn.setText(getString(R.string.debug_open));
                        customAlert.dismiss();
                    }else{
                        ToastUtil.toast(getString(R.string.login_pwd_fail));
                    }
                }
            });
            dialogView.findViewById(R.id.sap_alert_dialog_cancel).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String str = adminPwd.getText().toString();
                    if (str.equals("888888")) {
                        ToastUtil.toast("关闭");
                        editor.putString("univ_set_debug", "0");
                        editor.apply();
                        setDebugbtn.setText(getString(R.string.debug_close));
                        customAlert.dismiss();
                    }else{
                        ToastUtil.toast(getString(R.string.login_pwd_fail));
                    }
                }
            });
    
    
        }
    展开全文
  • Dialog的自定义,仿淘宝、天猫、京东等商城广告弹窗 学习,学习,学以致用 Dialog已经是安卓开发者的家常便饭了,经常用来作为一些提醒功能,但是它也可以拓展为广告弹窗效果,让我们来自定义一个广告的Dialog吧。...
  • 近期公司人事调整,自己也从之前的基础部门转到了商业产品部门,整体的业务有了不小的变动,最近阅读相关业务代码的时候,发现商业方向的产品需求较多的涉及android弹窗,所以自己有必要在这里做以总结和整理。...
  • Android几种弹窗的实现

    2016-03-31 16:03:35
    直接使用android sdk里面的Dialog以及子类AlertDialog,这种弹窗要求依赖Activity环境,如果传入的context不是activity就会报错,所以这种弹窗是和界面强相关的 使用系统弹窗:TYPE_SYSTEM_ALERT,而且要加权限:...
  • 广告活动弹窗

    2017-09-06 16:28:59
    由于在实现二维码扫描功能的时候发现集成二维码扫描功能并不是特别方便,于是有了将其制作成标准库的想法,这个二维码库能够快速,方便的集成二维码扫描功能,项目地址是在:android-zxingLibrary**,在项目开源后有...
  • 初学者,今天正好做到了定义弹窗显示动画的问题,干脆就写出来留着以后自己看看 首先在style中定义: @anim/set_menu_topbar_in @anim/set_menu_topbar_out 分别看一下 in 和 out 这两个 文件 set_...
  • Android自定义Dialog弹窗

    2019-05-29 14:41:47
    核心思想就是通过Dialog的构造函数来创建Dialog,然后给Dialog设置自定义布局 fun showAlertDialog(context: Context, title: String, message: CharSequence, positive: String, negative: String, cmListener: ...
  • 安卓APP去广告弹窗

    2018-09-17 20:48:00
    学习笔记二:对APP内的弹窗广告以及APP初始化的广告进行去除 一、对需要去除广告的APK进行安装,查看其原始状态 以下为该APP初始化以及加密方式切换后会弹出的广告 二、利用Android kill 对该APK进行反编译 ...
  • 很多小伙伴可能正在为顶级窗口弹出的黑色背景而发愁.即使使用了自定义的边框效果,但是方形黑色的背景还是存在.下面简单介绍一个很有用的属性,可以使背景透明化,这样就可以实现用...弹窗必须写在UI线程中哦  WindowM
  • 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗口显示在锁屏的上面。接下来就是试验可能相关的 Window Type 属性,验证该方案是否可行。转载请...
  • 本文已在我的公众号hongyangAndroid原创首发。...貌似前段时间刷知乎看到的一种非常有特色的广告展现方式,即在列表页,某一个Item显示背后部分广告图,随着列表滚动,会逐渐展示全部图片。 刚看到
  • 在网上找了大半天,都没有找到合适的例子,终于靠自己的努力,实现了这个功能 给大家分享一下效果图: //这是一个方法,直接放在onCreat方法里面就行了,我之前放的方法,没有进行耗时操作,就一直报找不到...
  • 本文参考了https://blog.csdn.net/u010648159/article/details/50493847,并改进了一个原文中的bug...     ... ...import android.animation.AnimatorSet;...import android.content.Context;...import android.graphics.P...
  • TDialog是用DialogFragment封装的一个弹窗库,使用很方便。
  • 开发Android应用时,有是为了收益会增加一些广告。但是广告不断的滚动显示,又很烦人,降低用户体验,所以就需要增加一个关闭的按钮来隐藏或者关闭广告。有的应用是直接将关闭广告的功能做到了设置界面里边,但有...
  • 上回讲到了 业务弹窗管理的Dialog形式 有兴趣的同学 可以点击这里去往上一篇文章了解回顾一下 这回的PoplayerV2版本是在此前Dialog基础上拓展了一部分同学关心的透明Webview弹窗实践效果 春节几天假期加上上班休息的...
1 2 3 4 5 ... 20
收藏数 1,266
精华内容 506
关键字:

弹窗广告android开发