2016-08-18 22:18:13 u013592964 阅读数 1419
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19571 人正在学习 去看看 任苹蜻

android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow;Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种。

**Popupwindow与Dialog的区别:**AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情的哦。
而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待。

PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。其实Popupwindow是自己提供了偏移的设置,但使用AlertDialog获取window对其进行相关设置也能达到弹窗位置随意显示的效果,接下来的高仿QQ空间弹窗就是使用AlertDialog实现任意位置显示弹窗效果的。

——————————————–分割线————————————————–

接下来就要讲高仿QQ空间弹窗的实现
PS:有人喜欢继承Dialog自定义Dialog,但我还是喜欢子在用的到的地方自己写,除非这个dialog会被用多次.
现在讲一下高仿QQ空间弹窗的需求,QQ空间每天说说的右上角会有一个小三角,点击会弹出一个弹窗,同时弹窗会随着Listview中item的小三角的位置变化。不清楚的话用手Q体验一下就好了。

核心代码:

@SuppressLint("NewApi")
public void showDialog(View v) {
    int[] coo = new int[2];// 获取小三角view位置,用来设置dialog的显示位置
    v.getLocationInWindow(coo);
    /* 先实例化dialog并进行相关设置 */
    final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
            .create();
    dialog.show();
    dialog.setCanceledOnTouchOutside(true);
    LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(
            R.layout.dialog_content, null);

    dialog.setContentView(ll);
    /*//计算dialog显示的view的高度
    ll.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    int ch = ll.getMeasuredHeight();*/
    /* 获取window并进行相关设置 */
    Window window = dialog.getWindow();
    if (coo[1] > sh * 0.65) {//sh指屏幕高度,sw指屏幕宽度,但小三角的位置超过屏幕的65%时,弹窗就变为在小三角上面显示
        window.setWindowAnimations(R.style.mydialog2); // 添加动画
        coo[1] -= sh*0.2;//y轴减去sh*0.2是因为dialog的高度为sh*0.2
    } else {
        window.setWindowAnimations(R.style.mydialog); // 添加动画
    }
    window.setGravity(Gravity.TOP);/*一定要设置为TOP,因为lp中的设置的x,y都是基于这个位置的
    ,如果为TOP,lp设置的y为0时,就在最上面显示,如果为CENTER,y为0时,dialog就在中间显示*/
    /* window的宽高,为window的一部分 */
    WindowManager.LayoutParams lp = window.getAttributes();
    lp.width = (int) (sw * 0.8);
    lp.height = (int) (sh * 0.2);
    lp.y = coo[1];
    window.setAttributes(lp);

}

上面是核心代码,全部代码下载链接:http://download.csdn.net/detail/u013592964/9606680
效果图:这里写图片描述
PS:没有美工,界面丑了点

2016-11-07 10:29:50 u014608640 阅读数 704
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19571 人正在学习 去看看 任苹蜻

android-adDialog

简介:广告活动弹窗控件

更新日志

  • compile 1.0 2016/08/08 完成广告活动弹窗 1.0 版本

  • compile 1.0 2016/08/08 删除 demo 中约束引用(否则 AS2.2 以下编译有问题)

在介绍具体的使用说明之前,我们先看一下简单的实现效果: 

image

使用说明

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

  • 默认支持弹窗从上,下,左,右,左上,右上,左下,右下等八个方向弹出,更可以设置从任意指定的角度(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);

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

image

  • (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);
            }
        });

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

image

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

  • (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);
            }
        });

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

image

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

  • (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);
            }
        });

然后我们看一下动画效果: 
image

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

  • (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);
            }
        });

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

image

这里我内置了三种 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);
            }
        });
2018-07-16 11:46:19 Mr_Leixiansheng 阅读数 1593
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19571 人正在学习 去看看 任苹蜻

转载请注明出处: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的值即可。楼主就偷个懒啦,啊哈哈~~

2010-11-24 12:16:00 caszhao 阅读数 11448
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19571 人正在学习 去看看 任苹蜻

在网络上很多Apk应用程序中,作者会对免费的版本加入广告,然后理所当然的网络上也出现了大量的去广告版。另外,也有一些软件,启动时会弹个窗口出来,要么是一些无用的提示,要么是建议你去注册。各大Android爱好者热衷于去下载这些无广告版无弹窗的Android软件,理由也很简单,看起来和用起来都舒服。

在这小节里,我们简单的研究下,这些广告和弹窗是如何被去掉的。

当然,这里所有的修改都建立在apktool反编译的基础上。前面的文章已经阐述过了,我们直接讲核心的部分。

实验的对象,也是一个简单的自己写的apk。图片如下:

clip_image002

去广告

最简单的去广告方法:修改layout中的ImageView的width和height属性为0dip。

这种方法原理是把显示广告的部分长度和宽度改为零。这样做优点是简单,缺点当然其实这个图片还是存在,还会占资源,如果是网络广告,那么还会从网络上下载,理所当然的,图片的下载会消耗你的一定得流量。

相对彻底的去广告方法:以ImageView显示图片为例, ImageView中加载图片(或动画)的方法有setImageBitmap、setAnimation、setBackgroundDrawable、draw等,在smali中找到这些函数,然后使用#号注释掉该部分。如下

clip_image004

然后,再把layout中ImageView相应的width和height设置为0dip,就可以了(为避免程序出错,不太建议删除掉)

如果是网络图片,那么则会存在一个网络下载的步骤,把相应的一系列的步骤全部注释掉就可以。简单的点的改法,可以把Url置为空。本例中,我把

const-string v6, "http://www.baidu.com/img/logo-yy.gif "

改为

const-string v6, ""

这样,apk就无法从指定地址下载到图片了。

去弹窗

以本例为背景,本例的弹窗是出自AlertDialog,可以把相应的整块Builder, AlertDialog相关的代码注释掉,简单点的改法,把show事件注释就可以。如下:

clip_image006

最后就是测试一下!

2016-10-13 19:58:49 georgeNi 阅读数 745
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19571 人正在学习 去看看 任苹蜻

最近做项目,为了让订单信息及时得到反馈,所以要求在锁屏状态收到推送消息时,唤起屏幕显示消息。经参考http://blog.csdn.net/maosidiaoxian/article/details/40587935完成该项功能。

首先,在应用界面发一条广播,模仿后台发出一条推送消息:

handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent=new Intent();
                intent.setAction("testScreenDown");
                sendBroadcast(intent);
            }
        },5*1000);

广播接受到消息处理(记得注册广播):

<span style="white-space:pre">	</span>//锁屏弹窗
        KeyguardManager km
                = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        //判断是否在锁屏状态
        if (km.inKeyguardRestrictedInputMode()) {
            Intent alarmIntent = new Intent(context, ScreenDownActivity.class);
            //从广播里跳转至activity,需要添加以下标志,不然会报错!
            alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(alarmIntent);
        }

这里用到一个KeyguardManager,锁屏与解锁的管理类,不过其有关解锁的内部类已经从api13开始废弃了:


可以看到,解锁与锁屏都可以用2个Flag代替,使用起来会更简单,待会用到。

继续,就要开始写锁屏时要弹出来的activity了,先注册:

 <!-- 锁屏弹窗界面-->
        <activity
            android:name=".activity.ScreenDownActivity"
            android:excludeFromRecents="true"
            android:launchMode="singleInstance"
            android:taskAffinity=""
            android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
            ></activity>

其中excludeFromRecents属性按照字母理解,就是让整个界面不出现在最近访问的历史中,主题设置很重要,该主题是让界面背景设置成当前手机的桌面背景,这样看起来就不会显得突兀了!

acitvity中代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_down);
        final Window win = getWindow();
        win.addFlags
                        //让该界面显示在锁屏屏幕之上(或者说短暂的隐取锁屏界面)
                (WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        //在未设置锁屏功能时自动解锁
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        //在该界面显示时,保持屏幕常亮
 //             | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        //唤醒屏幕
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        initViews();

    }

当中就用到之前提到的flag,另外提一下另一种方法唤醒(已过时,可以不用,了解一下):

 @Override
    protected void onNewIntent(Intent intent) {
//        PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
//        if (!pm.isScreenOn()) {
//            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |
//                    PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
//            wl.acquire();
//            wl.release();
//        }
    }

最后附上效果图:


附加github地址:https://github.com/george-wind/ScreenDownWindow






安卓APP去广告弹窗

阅读数 5544

android-adDialog

阅读数 511

没有更多推荐了,返回首页