android開發屏幕
『壹』 怎樣讓android開發程序不隨著屏幕轉動啊
1.在AndroidManifest.xml的每一個需要禁止轉向的Activity配置中加入 android:screenOrientation=」landscape」 屬性。 landscape = 橫向 portrait = 縱向 2.android中每次屏幕方向切換時都會重啟Activity,所以應該在Activity銷毀前保存當前活動的。
禁止屏幕隨手機旋轉變化 有時候我們希望讓一個程序的界面始終保持在一個方向,不隨手機方向旋轉而變化: 在AndroidManifest.xml的每一個需要禁止轉向的Activity配置中加入android:screenOrientation=」landscape」 屬性。 landscape = 橫向 portra。
在manifest文件中加入 screenOrientation=「portrait」 限制屏幕豎屏顯示 screenOrientation=「landscape」 限制屏幕橫屏顯示
使用嵌套布局 相對布局裡面嵌套一個線性布局 可以防止出現解析度混亂 這里我們使用相對布局嵌套一個線性布局可以完成 標題在最上方 最下方是一個ActivityGroup 右邊的abcdef。選項條在最右邊 這3個都是相對布局裡的元素 然後 中間是一個線性布。
LZ可以試試android:screenOrientation="portrait"強制豎屏,然後通過感測器來檢測是否旋轉了屏幕。LZ可以先嘗試一下啊加速度感測器看看,這個應該每個手機都會有
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//強制為橫屏 或者在AndroidManifest.xml 裡面添加android:screenOrientation=」landscape」
Android 平台提供了兩類動畫,一類是 Tween 動畫,即通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果;第二類是 Frame 動畫,即順序播放事先做好的圖像,跟電影類似。本文分析 Tween動畫的rotate實現旋轉效果。
『貳』 Android開發常用的Util方法(屏幕UI篇)
如果你要封裝工具類,注意使用 static關鍵字
有錯誤或者需要補充的歡迎及時指正~~
調用: showToast(上下文, 土司內容)
說明: Toast 是可以用 Application的Context 當上下文的,如果你有寫Application類,可以直接把它的 單例 弄過來,這樣就又少傳一個參數了。友情提示Application的單例應該這樣寫
調用: showSnackBar(當前Activity, 提示文字, 按鈕文字, 點擊回調, Snackbar回調)
說明: Snackbar 和 Toast 就不一樣了,顯示環境必須有一個 View ,這里選擇把當前Activity的rootView傳給它,可避免它與導航欄的不河蟹問題。此封裝參數較多(還沒涉及顏色呢),建議根據實際應用場景再重載幾個。比如你沒打算讓Snackbar消失時再做什麼事,最後那個Callback就可以傳null(當然要自己把相關判斷做了)
調用: getScreenWidth(上下文)
說明:上下文可以傳Application的Context。 getWidth() 和 getHeight() 兩個方法已過時,不推薦再用
調用:重寫 Activity 的 onKeyDown() 方法
說明:給用戶的提示建議用Toast或者Snackbar。
調用:重寫 Activity 的 dispatchTouchEvent() 方法
說明:調用時傳的是 this ,實際上也可以傳Application的Context。另外單就隱藏軟鍵盤而言,方法有很多,這里給出的並非最優解,有興趣可繼續搜索。
沒有外傳參數,一般不用封裝,直接寫到你的 Activity 的 onCreate() 或者 Fragment (這時需要先getActivity()再getWindow())的 onCreateView ()方法裡面就行,頁面較多時建議弄一個base父類。
說明:如果有 ToolBar 或者 ActionBar ,狀態欄會和它們一體化,這時你也可以選擇把bar隱藏或設成透明。另外如果寫成下面這樣
結果就是導航欄也跟著變透明了。游戲一類的應用可以這么寫,看圖的話見仁見智,我本人更喜歡保留導航欄
『叄』 Android開發中如何固定屏幕顯示
在Androidmanifest文件裡面設置
android:screenOrientation="landscape"是限制此頁面橫屏顯示,
android:screenOrientation="portrait"是限制此頁面數豎屏顯示。
『肆』 Android開發 怎樣獲取屏幕的寬高是多少厘米
我們需要獲取Android手機或Pad的屏幕的物理尺寸,以便於界面的設計或是其他功能的實現。下面就介紹講一講如何獲取屏幕的物理尺寸
下面的代碼即可獲取屏幕的尺寸。
在一個Activity的onCreate方法中,寫入如下代碼:
[java] view plain print?
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕寬度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕寬度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
但是,需要注意的是,在一個低密度的小屏手機上,僅靠上面的代碼是不能獲取正確的尺寸的。比如說,一部240x320像素的低密度手機,如果運行上述代碼,獲取到的屏幕尺寸是320x427。因此,研究之後發現,若沒有設定多解析度支持的話,Android系統會將240x320的低密度(120)尺寸轉換為中等密度(160)對應的尺寸,這樣的話就大大影響了程序的編碼。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens節點,具體的內容如下:
[html] view plain print?
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" /> 這樣的話,當前的Android程序就支持了多種解析度,那麼就可以得到正確的物理尺寸了。
[java] view plain print?
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.TextView;
public class TextCanvasActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(new MyView(this));
//定義DisplayMetrics 對象
setContentView(R.layout.main);
DisplayMetrics dm = new DisplayMetrics();
//取得窗口屬性
getWindowManager().getDefaultDisplay().getMetrics(dm);
//窗口的寬度
int screenWidth = dm.widthPixels;
//窗口高度
int screenHeight = dm.heightPixels;
TextView textView = (TextView)findViewById(R.id.tv1);
textView.setText("屏幕寬度: " + screenWidth + "\n屏幕高度: " + screenHeight);
}
}
『伍』 android開發橫豎屏問題
Android橫屏豎屏設置
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置成全屏模式
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//強制為橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏
我做的東西裡面還用到了去掉標題欄。
我也貼出來
requestWindowFeature(Window.FEATURE_NO_TITLE);
垂直居中:
android:layout_centerVertical="true"
水平居中:
android:layout_centerHorizontal="true"
1.hideStatusbarAndTitlebar()隱藏statusbar和titlebar.
private void hideStatusbarAndTitlebar() {
final Window win = getWindow();
// No Statusbar
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// No Titlebar
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
2.設置屏幕顯示模式ScreenOrientation.
在activity里設置android:screenOrientation的值。
android:screenOrientation的屬性有以下值:
unspecified(默 認值,由系統判斷狀態自動切換),The default value. The system chooses the orientation. The policy it uses, and therefore the choices made in specific contexts, may differ from device to device.
landscape,橫屏
portrait,豎屏
user(用戶當前設置的orientation值),The user's current preferred orientation.
behind(下一個要顯示的Activity的orientation值),The same orientation as the activity that's immediately beneath it in the activity stack.
sensor(傳 感器的方向),The orientation determined by a physical orientation sensor. The orientation of the display depends on how the user is holding the device; it changes when the user rotates the device.
nosensor(不 使用感測器,這個效果差不多等於unspecified).An orientation determined without reference to a physical orientation sensor. The sensor is ignored, so the display will not rotate based on how the user moves the device. Except for this distinction, the system chooses the orientation using the same policy as for the "unspecified" setting.
3.水平/垂直居中的方法.
設置parent的android:gravity為"center"。
4.獲得當前屏幕寬高的方法.
Display display = getWindowManager().getDefaultDisplay();
Config.screenWidth = display.getWidth();
Config.screenHeight = display.getHeight();
『陸』 android屏幕適配
android設備碎片化嚴重,因此在實際開發的時候需要做屏幕適配
適配主要是在以下幾個方面:
常見的布局適配主要是以下幾點:
a.避免寫死布局尺寸,使用wrap_content或者martch_parent
b.使用權重,比如linearlayout中的weight;
c.使用relative的相對位置擺放,比如layout_centerInParent="true"
d.ConstraintLayout 原理類似於relatvie,相對擺放,但是性能相對於relatvie會好一點
e.android官方的庫Percent-support-lib,該庫主要是用的是百分比適配
a. .9圖適配,這個是使用了.9圖可以在特別區域拉伸不失真的特性來適配
b. 使用多套點陣圖,匹配不同的解析度,比如在mipmap,mipmap-xhdpi,mipmap-xxhdpi,等文件夾下面放多套解析度不同的內容相同的圖片
是指同一個業務邏輯,在不同的設備上執行不同的跳轉方式,比如在手機上打開一個新的activity,但是在平板上,可以在橫屏狀態下,右側增加一個fragment,展示打開的頁面。
a.解析度限定符,使用drawable-dpi,drawable-hdpi等
b.尺寸限定符
c.最小寬度限定符
d.屏幕方向限定符
a.android9.0開始 有官方的api進行適配
b.華為,小米,魅族,vivo,oppo各大room廠商有對應的api進行適配
除了以上這些,還有dimens適配,但是都各有缺點,有的需要多套圖,有的需要多套資源文件,dimens適配的dimens文件過多,需要針對不同的屏幕解析度來生成對應的文件,比較繁瑣
以上,實際開發中,做的最多的適配為布局適配
開發中屏幕適配的核心是在於屏幕縮放,不論是哪種屏幕適配,都是以這個縮放為基礎
已知:設計圖手機像素(W,H),設計圖上控制項的像素值(ViewW,ViewH),目標設備解析度(TargetW,TargetH)
求:目標設備上view的寬高(TargetViewW,TargetViewH)
公式:寬:ViewW / W * TargetW=TargetViewW
高:ViewH / H * TargetH =TargetViewH
原理:根據當前設備的解析度,計算出設計圖上的控制項在該設備上的縮放比,然後根據縮放比,來動態的設置view, 最終換算出來的單位為px
該適配方式是通過自定義外部的ViewGroup,比如LinearLayout,RelativeLayout,在onMeasure方法中,遍歷子view,設置寬高以及padding,margin
以下是封裝了一個工具類,用來獲取屏幕寬高以及計算縮放比:
未完待續
『柒』 進行Android開發的時候沒有測試機適配怎麼辦,如何進行屏幕適配
Android項目的res目錄下一般加上我們自己創建的,會有6個目錄,分別是:drawble drawble-ldpi drawble-mdpi drawble-hdpi drawble-xhdpi drawble-xxhdpi, 這里就不包括更為特殊的drawble目錄了,(比如drawlbe-land-hdpi, 表示水平方向的高解析度的圖片,這些都目錄不管多麼長,它們都是按一丁點規律匹配的, 我們的目的是, 從個別中發現規律,從而應用到整體)。
當一個apk運行起來時,Android系統會根據其所運行的手機的屏幕密度去相對應的圖片文件夾里找指定名稱的圖片。 注意, 先去哪個目錄里找,完全是根據這個手機的屏幕密度決定的。
其中注意兩點:
1, 中等解析度,即mdpi的屏幕密度是160,他是標準的參考密度。所以計算比例的時候它的比例值是1. 其他屏幕密度的參考比例都是以這個為依據。
2, 默認的drawble目錄(一般是自己建的),和mdpi是一樣的。將圖片放到這個目錄和放到drawble-mdpi目錄是一樣的效果。不過一般習慣性的放一些自定義selector或者點9的圖片在這里。
現在我們來看, HTC one V手機的屏幕密度是252ppi, 那距離哪一個最靠近呢, 就是hdpi了。 所以當apk運行在這個手機上時,首先會去這個目錄找圖片。
下面是用常見的一些類型的手機總結的一個表格:
注意一點: 上面說的對應關系,都是首選目錄, 那如果首選目錄裡面找不到圖片呢?
Android圖片選擇策略
上面說到, 如果屏幕所對應的文件夾沒有要找的圖片,怎麼辦。這是很常見的,我們開發項目時一般不會去為每一個級別的屏幕去切一套圖片。那樣做只會讓apk很大。所以一般性的圖片我們只切一兩個典型密度屏幕的圖片。但是apk是有可能會運行在從ldpi到xxhdpi的各種級別的手機上。這個時候就需要根據一定的策略去尋找圖片了。
Android系統尋找圖片的步驟是這樣的:
1, 去屏幕密度對應的目錄去找。如果找到就拿來用。
2, 如果沒找到,就去比這個密度高一級的目錄裡面去找,如果找到就拿來用。
3, 如果沒找到就繼續往上找。以此類推。
4, 如果到了xxhdpi目錄還沒有找到的話,就會去比自身屏幕密度低一級的目錄去找,如果低一級的目錄>=hdpi,找到了就拿來用。
5, 如果沒找到, 就去mdpi目錄去找, 如果找到了,就拿來用。
6, 如果沒找到,就去默認的drawble目錄里去找, 如果找到了就拿來用。
7 ,如果沒找到,再去最低的ldpi目錄里去找。如果找到了,就拿來用。
8, 如果沒找到, 那就是沒找到了, 圖片無法顯示。(不過一般不會出現這種現象,因為如果每個目錄都沒有這個圖片的話,你是編譯不過的)
這里有兩點需要注意:
① 首先會去比自己密度高的目錄里去找,這是因為因為系統相信,你在密度更高的目錄里會放置解析度更大的圖片,這樣的話這個圖片會被縮小,但同時顯示效果不會有損失,但是如果優先去低一級別的目錄去找的話, 找到的圖片就會被放大,這樣的話這個圖片就會被拉扯模糊了。
e.g. 同一張圖片,你在mdpi和xxhdpi目錄各放了一份, 這個應用你現在運行在hdpi的手機上, 那應用會選擇哪張圖片呢。答案是xxhdpi目錄里的。即便hdpi離mdpi更近一點!
②,如果在mdpi里找不到是不會直接去ldpi里找的, 而是先去默認的drawble目錄里找,這是drawble目錄和drawble-mdpi是一個級別的。
下面用一張流程圖來總結:
(註: 以上流程圖是我通過做實驗總結出來的,如有謬誤還望指出。)
Android系統對圖片的縮放規則
上文中提到如果在手機對應的目錄沒有找到圖片,就會按照一定的策略去其他目錄找,那找到了以後就原圖顯示么? 非也。
對於放在不同目錄下的圖片, 系統會按照一定比例對原始的圖片進行放大或者縮小, 具體的放大縮小比例可參考下表, 圖片所在目錄和對應的屏幕密度是相同時圖片縮放比例為1,也就是原圖顯示,而橫向的比例表示分別放在該密度手機上運行時圖片被縮放的比例。
對原始圖片的縮放倍數。
上表幾點值得注意的地方:
①, drawable目錄和drawable-mdpi目錄和dp到px的轉換關系是一樣的。
②,當你放一個120px*180px的圖片到drawable-hdpi目錄,如果此應用運行在一個xhdpi的手機上,則這個圖片會被拉扯到160px*240px。
③, 最後一行dp->px, 說明了在代碼或者布局文件中聲明一個dp值, 這個值在不同屏幕密度的手機中會被乘以不同的倍數。 比如你在布局文件中寫了一個寬和高分別為120dp和180dp的LinearLayout, 那麼當這個應用運行在xhdpi的手機上時(比如上面那個常見手機表中的中興U985手機),它的實際像素就會被轉換為240px*360px。 如果運行在ldpi的手機上,就變成了90px*135px。 但是在這兩個手機中顯示的區域大小從肉眼看,是一模一樣大的。(這點作為後面內容的一個引子,「看起來」一樣大,這就是Android的一個神奇的地方)
我們來做個試驗
試驗材料:
① 一張120px*180px的圖片
② 四部手機, 具體參數參考上面的一張表格。三星 Galaxy win pro 3218 (hdpi)、 HTC one V (hdpi)、 中興U985 (xhdpi)、Google Nexus 7 (xhdpi)。
③ 我在布局文件里聲明了3個View, 第一個位於左上角,是一個線性布局,寬和高指定為120dp*180dp(注意是dp哦), 第二個位於右上角,是一個ImageView,內容就是上面這張120px*180px的圖片, 第三個位於左下角也是一個線性布局,固定寬高,是120px*180px。
我將這個圖片放到一個Android工程里的drawable-hdpi目錄
從上面的那種縮放關系表中我們可以知道,圖片從hdpi目錄中取, 運行在hdpi手機上寬高保持原始值,,運行在xhdpi手機上,寬高會乘以4/3, 也就是說圖片會被拉扯變大, 但是圖片的實際顯示效果,即「視覺大小」怎麼樣呢。
下面是運行後的效果:
如圖: 黑色區域是120dp*180dp的View, 藍色區域是120px*180px的圖片, 灰色區域是120px*120px的View。
1, 可以看到使用dp的View(黑色區域)在不同解析度,不同屏幕尺寸,不同屏幕密度的手機下,視覺大小看起來是一模一樣的。
但是他們的實際像素值是不一樣的: 120dp*180dp -> (hdpi) -> 180px*270px, 而120dp*180dp ->(xhdpi)-> 240px*360px。 由於屏幕密度的不同,縮放以後的像素可以顯示出一樣的視覺大小。
2, 藍色圖片的視覺大小也是一樣的, 由於圖片放到了hdpi目錄下, 所以前兩個手使用的是圖片的原始像素120px*180px, 而後兩個手機對圖片進行了放大, 參考上面的屏幕密度縮放關系表, 放大了4/3倍。 我通過對屏幕的截圖,測量下來的結果的確是放大了這么多, 分別為160px*240px。 由於屏幕密度的不同,它們顯示出來的視覺大小是相同的。
3, 但是使用固定像素值的View就沒那麼幸運了, 它在hdpi的手機上看起來要比在xhdpi的手機上大一些。 要是在屏幕密度相差更大的手機上看的話, 這個區域的大小會相差很大。 這就是為什麼Android推薦使用dp作為View的尺寸,而不是真實像素的原因了。
4, 經過反復試驗,(實驗結果就不貼圖了,很多),得出一個結論,使用哪個目錄下的圖片(前提是圖片只放在某一個目錄中),在所有,不管是解析度還是屏幕尺寸還是屏幕密度,3個參數都在改變的情況下,圖片顯示的視覺大小都和運行在這個目錄對應屏幕密度手機上時的大小是一樣的。
UI給工程師切多大圖是合適的。
說說我之前走的冤枉路吧。
在之前, 設計師的交互和視覺設計都是基於480*800的界面, 切圖的時候會以480*800為基礎切一版, 然後在給所切圖片的寬和高乘上個4/3,然後在出一版。
比如同一個120*180的圖片, 就會出兩個版本, 一個是120*180的一個是160*240的。分別放到hdpi目錄和xhdpi目錄。
吃到的苦頭是,UI很累, apk很大。T^T
這番探究下來, 發現直接基於720*1280的視覺稿切一版圖片就可以了。 將圖片只放到xhdpi目錄中,這樣系統會在不同密度屏幕的手機中對圖片進行合理的縮放, 而之前這個縮放工作竟然是人工完成的!
另: 如果想在xxhdpi的手機上顯示的很好, 也可以基於1080P的屏幕設計, 這樣的話就兼容所有低密度屏幕的手機, 而且也不會出現圖片被拉扯的現象。
『捌』 Android一般開發的時候的屏幕適配是怎麼做的
Android中一個layout想適配各種屏幕尺寸那麼需要按以下規則去寫layout:
1. 盡量使用wrap_content、match_parent、weight 來規定layout的大小。
2. 要確保布局的靈活性並適應各種尺寸的屏幕,應使用 「wrap_content」 和 「match_parent」 控制某些視圖組件的寬度和高度。
3. 使用 「wrap_content」,系統就會將視圖的寬度或高度設置成所需的最小尺寸以適應視圖中的內容,而 「match_parent」(在低於 API 級別 8 的級別中稱為「fill_parent」)則會展開組件以匹配其父視圖的尺寸。
4. 如果使用 「wrap_content」 和 「match_parent」 尺寸值而不是硬編碼的尺寸,視圖就會相應地僅使用自身所需的空間或展開以填滿可用空間。此方法可讓布局正確適應各種屏幕尺寸和屏幕方向。
5. 如果某些地方必須要規定控制項的大小,那麼要使用dp 或者 dip單位。
6. 欄位必須使用 sp單位。
7. 將不同的圖片放到不同的drawable目錄下,解析度的匹配規則如下:
drawable-mdpi 320 * 480
drawable-hdpi 480*800
drawable-xhdpi 720 * 1280
drawable-xxhdpi 1080 * 1920
drawable-xxxhdpi 1080+
『玖』 android開發 使用夜神模擬器 屏幕旋轉問題
沒想到在中演示時候遇到了崩潰,檢查發現是Asdk關閉之後在Bsdk的onActivityResult 方法,B頁面成員變數丟失。
最終發現有夜神模擬器有橫豎屏切換,加上沒有保存現場,由於頁面都是豎屏,於是選擇了最簡單的在AndroidManifest 配置了
強制豎屏,但是還是在返回過程中 模擬器切換橫屏頁面一閃而過,debug驗證確認。這種情況再正常情況下不會出現,考慮是不是夜神模擬器做了橫屏的修改。
解決辦法
1.頁面做了保存現場,和現場恢復
2.夜神模擬器在後台直接配置成手機豎屏模式
如果還有其他解決方法,可以討論一下
『拾』 如何在Android開發中實現屏幕切換
屏幕切換指的是在同一個Activity內屏幕間的切換,最長見的情況就是在一個FrameLayout內有多個頁面,比如一個系統設置頁面;一個個性化設置頁面。android.widget.ViewAnimator類繼承至FrameLayout,ViewAnimator類的作用是為FrameLayout裡面的View切換提供動畫效果。
該類有如下幾個和動畫相關的函數:
setInAnimation:設置View進入屏幕時候使用的動畫,該函數有兩個版本,一個接受單個參數,類型為 android.view.animation.Animation,一個接受兩個參數,類型為Context和int,分別為Context對象和定義 Animation的resourceID。
setOutAnimation: 設置View退出屏幕時候使用的動畫,參數setInAnimation函數一樣。
showNext: 調用該函數來顯示FrameLayout裡面的下一個View。
多數情況下是使用ViewFlipper 是繼承至FrameLayout的,所以它是一個Layout裡面可以放置多個View。ViewFlipper可以用來指定FrameLayout內多 個View之間的切換效果,可以一次指定也可以每次切換的時候都指定單獨的效果。
isFlipping:用來判斷View切換是否正在進行
setFilpInterval:設置View之間切換的時間間隔
startFlipping:使用上面設置的時間間隔來開始切換所有的View,切換會循環進行
stopFlipping: 停止View切換