導航:首頁 > 操作系統 > pixelformatandroid

pixelformatandroid

發布時間:2022-11-04 20:07:46

android 怎麼設置 懸浮activity

Android懸浮窗實現

下面實現來自於android學習手冊,裡面有實現的可運行的例子還有源碼。android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼採用android studio目錄結構,高亮顯示代碼,文檔都採用文檔結構圖顯示,可以快速定位。360手機助手中下載,圖標上有貝殼
實現基礎
Android懸浮窗實現使用WindowManager ,WindowManager介紹
通過Context.getSystemService(Context.WINDOW_SERVICE)可以獲得 WindowManager對象。
每一個WindowManager對象都和一個特定的 Display綁定。
想要獲取一個不同的display的WindowManager,可以用 createDisplayContext(Display)來獲取那個display的 Context,之後再使用:Context.getSystemService(Context.WINDOW_SERVICE)來獲取WindowManager。
使用WindowManager可以在其他應用最上層,甚至手機桌面最上層顯示窗口。
調用的是WindowManager繼承自基類的addView方法和removeView方法來顯示和隱藏窗口。具體見後面的實例。
另:API 17推出了Presentation,它將自動獲取display的Context和WindowManager,可以方便地在另一個display上顯示窗口。

WindowManager實現懸浮窗需要聲明許可權
首先在manifest中添加如下許可權:
<!-- 顯示頂層浮窗 --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

注意:在MIUI上需要在設置中打開本應用的」顯示懸浮窗」開關,並且重啟應用,否則懸浮窗只能顯示在本應用界面內,不能顯示在手機桌面上。

服務獲取和基本參數設置
[java] view plain print?
// 獲取應用的Context
mContext = context.getApplicationContext();
// 獲取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
參數設置:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 設置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果設置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View收不到Back鍵的事件
params.flags = flags;
// 不設置這個彈出框的透明遮罩顯示為黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件傳遞到後面的窗口
// 設置 FLAG_NOT_FOCUSABLE 懸浮窗口較小時,後面的應用圖標由不可長按變為可長按
// 不設置這個flag的話,home頁的劃屏會有問題
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;

// 獲取應用的Context
mContext = context.getApplicationContext();
// 獲取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
//參數設置:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 設置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果設置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View收不到Back鍵的事件
params.flags = flags;
// 不設置這個彈出框的透明遮罩顯示為黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件傳遞到後面的窗口
// 設置 FLAG_NOT_FOCUSABLE 懸浮窗口較小時,後面的應用圖標由不可長按變為可長按
// 不設置這個flag的話,home頁的劃屏會有問題
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
點擊和按鍵事件
除了View中的各個控制項的點擊事件之外,彈窗View的消失控制需要一些處理。
點擊彈窗外部可隱藏彈窗的效果,首先,懸浮窗是全屏的,只不過最外層的是透明或者半透明的:

具體實現
[java] view plain print?
package com.robert.floatingwindow;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
/**
* 彈窗輔助類
*
* @ClassName WindowUtils
*
*
*/
public class WindowUtils {
private static final String LOG_TAG = "WindowUtils";
private static View mView = null;
private static WindowManager mWindowManager = null;
private static Context mContext = null;
public static Boolean isShown = false;
/**
* 顯示彈出框
*
* @param context
* @param view
*/
public static void showPopupWindow(final Context context) {
if (isShown) {
LogUtil.i(LOG_TAG, "return cause already shown");
return;
}
isShown = true;
LogUtil.i(LOG_TAG, "showPopupWindow");
// 獲取應用的Context
mContext = context.getApplicationContext();
// 獲取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
mView = setUpView(context);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 設置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果設置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View收不到Back鍵的事件
params.flags = flags;
// 不設置這個彈出框的透明遮罩顯示為黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件傳遞到後面的窗口
// 設置 FLAG_NOT_FOCUSABLE 懸浮窗口較小時,後面的應用圖標由不可長按變為可長按
// 不設置這個flag的話,home頁的劃屏會有問題
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
mWindowManager.addView(mView, params);
LogUtil.i(LOG_TAG, "add view");
}
/**
* 隱藏彈出框
*/
public static void hidePopupWindow() {
LogUtil.i(LOG_TAG, "hide " + isShown + ", " + mView);
if (isShown && null != mView) {
LogUtil.i(LOG_TAG, "hidePopupWindow");
mWindowManager.removeView(mView);
isShown = false;
}
}
private static View setUpView(final Context context) {
LogUtil.i(LOG_TAG, "setUp view");
View view = LayoutInflater.from(context).inflate(R.layout.popupwindow,
null);
Button positiveBtn = (Button) view.findViewById(R.id.positiveBtn);
positiveBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogUtil.i(LOG_TAG, "ok on click");
// 打開安裝包
// 隱藏彈窗
WindowUtils.hidePopupWindow();
}
});
Button negativeBtn = (Button) view.findViewById(R.id.negativeBtn);
negativeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogUtil.i(LOG_TAG, "cancel on click");
WindowUtils.hidePopupWindow();
}
});
// 點擊窗口外部區域可消除
// 這點的實現主要將懸浮窗設置為全屏大小,外層有個透明背景,中間一部分視為內容區域
// 所以點擊內容區域外部視為點擊懸浮窗外部
final View popupWindowView = view.findViewById(R.id.popup_window);// 非透明的內容區域
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
LogUtil.i(LOG_TAG, "onTouch");
int x = (int) event.getX();
int y = (int) event.getY();
Rect rect = new Rect();
popupWindowView.getGlobalVisibleRect(rect);
if (!rect.contains(x, y)) {
WindowUtils.hidePopupWindow();
}
LogUtil.i(LOG_TAG, "onTouch : " + x + ", " + y + ", rect: "
+ rect);
return false;
}
});
// 點擊back鍵可消除
view.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
WindowUtils.hidePopupWindow();
return true;
default:
return false;
}
}
});
return view;
}
}

❷ android 夜間模式怎麼實現

原理很簡單:利用setTheme調用不同的風格,而白天與黑夜的區別就是在於夜間模式直接利用黑色背景,其他圖片啊,背景啊,通通變成透明的,就可以了。
<!-- 默認風格 -->
<style name="BrowserThemeDefault" parent="@android:style/Theme">
<item name="bookimage">@drawable/day</item>
</style>

<!-- 夜間模式 --> 其實就是一張透明圖片
<style name="BrowserThemeNight" parent="@android:style/Theme">
<item name="nightimage">@drawable/night</item>
</style>
切換程序:
if (blFlag) {
this.setTheme(R.style.BrowserThemeDefault);
blFlag = false;
} else {
this.setTheme(R.style.BrowserThemeNight);
blFlag = true;
}

❸ 如何在Android中實現漸顯按鈕的左右滑動效果

左右滑動效果,在android4.0版本以下,需要用代碼去控制

android 4.0以上增加了 SwitchButton這樣的滑動控制項.


自己實現的方式比較多,可以繼承Button checkBox方式等等

以下為實現左右滑動效果的控制項:

❹ Android開發 如何打開前置攝像頭的代碼

找到surficeView
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
設置它的像素為800x600
surfaceView.getHolder().setFixedSize(800,480);
//下面設置surfaceView不維護自己的緩沖區,而是等待屏幕的渲染引擎將內容推送到用戶面前
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
然後就是回調
surfaceView.getHolder().addCallback(newSurfaceCallback());
上面的回調類是我們自己定義的,代碼如下
private class SurfaceCallback implementsSurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolderholder) {
try {
camera = Camera.open();//打開硬體攝像頭,這里導包得時候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
Display display = wm.getDefaultDisplay();//得到當前屏幕
Camera.Parameters parameters =camera.getParameters();//得到攝像頭的參數
parameters.setPreviewSize(display.getWidth(),display.getHeight());//設置預覽照片的大小
parameters.setPreviewFrameRate(3);//設置每秒3幀
parameters.setPictureFormat(PixelFormat.JPEG);//設置照片的格式
parameters.setJpegQuality(85);//設置照片的質量
parameters.setPictureSize(display.getHeight(),display.getWidth());//設置照片的大小,默認是和屏幕一樣大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());//通過SurfaceView顯示取景畫面
camera.startPreview();//開始預覽
isPreview = true;//設置是否預覽參數為真
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}

@Override
public void surfaceChanged(SurfaceHolderholder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolderholder) {
if(camera!=null){
if(isPreview){//如果正在預覽
camera.stopPreview();
camera.release();
}
}
}
}

❺ android如何獲取相機解析度

//參考SDK中的API,獲取相機的參數:
Camera.Parameters parameters = camera.getParameters();
//獲取預覽的各種解析度
List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
//獲取攝像頭支持的各種解析度
List<Size> supportedPictureSizes = parameters.getSupportedPictureSizes();

實例:
// 獲取照相機參數,設置需要的參數,其餘預設
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
// 設置照片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 設置預瀏尺寸,注意要在攝像頭支持的范圍內選擇
parameters.setPreviewSize(WIDTH, HEIGHT);
// 設置照片解析度,注意要在攝像頭支持的范圍內選擇
parameters.setPictureSize(WIDTH, HEIGHT);
// 設置照相機參數
camera.setParameters(parameters);
// 開始拍照
camera.startPreview();

❻ android點擊跳到左右滑動 頁面時 可以隨意指定先顯示第幾個頁面嗎

可以的,左右滑動的控制項就是viewPager,viewPager可以設置當前界面的。

具體設置代碼:

  1. viewPager.setCurrentItem(2); 表示轉跳第三頁,注意viewPager是從0開始的。

  2. viewPager.setOffscreenPageLimit(4); 表示四個界面來回切換不會重新創建。

  3. viewPager.getCurrentItem();表示獲取當前是第幾頁。

❼ Android中getWindow().setFormat(PixelFormat.UNKNOWN

看下 Window.java 中這個方法的源碼和注釋就知道了:


/**
*Settheformatofwindow,asperthePixelFormattypes.Thisoverrides
*
*windowdecorations.
*
*@paramformatThenewwindowformat(seePixelFormat).Use
*PixelFormat.
*theformat.
*
*@seePixelFormat
*/
publicvoidsetFormat(intformat){
finalWindowManager.LayoutParamsattrs=getAttributes();
if(format!=PixelFormat.UNKNOWN){
attrs.format=format;
mHaveWindowFormat=true;
}else{
attrs.format=mDefaultWindowFormat;
mHaveWindowFormat=false;
}
(attrs);
}


就不繼續往下追代碼了,要不得貼一大堆東西.

意思是,如果你傳了PixelFormat.UNKNOWN 進去,系統會根據設備進行自動適配.

❽ Android API中被忽略的幾個函數介面

1、Throwable介面中的getStackTrace()方法(或者Thread類的getStackTrace()方法),根據這個方法可以得到函數的逐層調用地址,其返回值為StackTraceElement[];

2、StackTraceElement類,其中四個方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調試程序列印Log時非常有用;

3、UncaughtExceptionHandler介面,再好的代碼異常難免,利用此介面可以對未捕獲的異常善後;
使用參見:Android使用UncaughtExceptionHandler捕獲全局異常

4、Resources類中的getIdentifier(name, defType, defPackage)方法,根據資源名稱獲取其ID,做UI時經常用到;

5、View中的isShown()方法,以前都是用view.getVisibility() == View.VISIBLE來判斷的(╯□╰);(謝評論提醒,這裡面其實有一個坑:【android】view.isShown ()的用法)

6、Arrays類中的一系列關於數組操作的工具方法:binarySearch(),asList(),equals(),sort(),toString(),OfRange()等;
Collections類中的一系列關於集合操作的工具方法:sort(),reverse()等;

7、android.text.format.Formatter類中formatFileSize(Context, long)方法,用來格式化文件Size(B → KB → MB → GB);

8、android.media.ThumbnailUtils類,用來獲取媒體(圖片、視頻)縮略圖;

9、String類中的format(String, Object...)方法,用來格式化strings.xml中的字元串(多謝 @droider An 提示:Context類中getString(int, Object... )方法用起來更加方便);

10、View類中的三個方法:callOnClick(),performClick(),performLongClick(),用於觸發View的點擊事件;

11、TextUtils類中的isEmpty(CharSequence)方法,判斷字元串是否為null或"";

12、TextView類中的append(CharSequence)方法,添加文本。一些特殊文本直接用+連接會變成String;

13、View類中的getDrawingCache()等一系列方法,目前只知道可以用來截圖;

14、DecimalFormat類,用於字串格式化包括指定位數、百分數、科學計數法等;

15、System類中的array(src, srcPos, dest, destPos, length)方法,用來數組;

16、Fragment類中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時貌似Fragment的其它生命周期方法都不會被調用,太坑爹!

17、Activity類中的onWindowFocusChanged(boolean),onNewIntent(intent)等回調方法;

18、View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置;

19、TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實現「顯示密碼」功能;

20、TextWatcher介面,用來監聽文本輸入框內容的改變,可用來實現一系列具有特殊功能的文本輸入框;

21、View類中的setSelected(boolean)方法結合android:state_selected=""用來實現圖片選中效果;

22、Surface設置透明:SurfaceView.setZOrderOnTop(true);
SurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);但是會擋住其它控制項;

23、ListView或GridView類中的setFastScrollEnabled(boolean)方法,用來設置快速滾動滑塊是否可見,當然前提是item夠多;

24、PageTransformer介面,用來自定義ViewPager頁面切換動畫,用setPageTransformer(boolean, PageTransformer)方法來進行設置;

25、apache提供的一系列jar包:commons-lang.jar,commons-collections.jar,commons-beanutils.jar等,裡面很多方法可能是你曾經用幾十幾百行代碼實現過的,但是執行效率或許要差很多,比如:ArrayUtils,StringUtils……;

26、AndroidTestCase類,Android單元測試,在AndroidStudio中使用非常方便;

27、TextView類的setKeyListener(KeyListener)方法;
其中DigitsKeyListener類,使用getInstance(String accepted)方法即可指定EditText可輸入字元集;

28、ActivityLifecycleCallbacks介面,用於在Application類中監聽各Activity的狀態變化;

29、Context類中的createPackageContext(packageName, flags)方法,可用來獲取指定包名應用程序的Context對象。

❾ Android編程中getWindow().setFormat(PixelFormat.TRANSLUCENT);這句話什麼意思,有什麼效果

樓上都扯淡的

這句話使窗口支持透明度
然後就可以用setAlpha,drawColor等函數來設置窗口透明程度
PixelFormat.TRANSPARENT和PixelFormat.TRANSLUCENT作用差不多,都是使窗口支持透明度

閱讀全文

與pixelformatandroid相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163