android圖片選擇器
A. Android中selector使用詳解
選擇器在android中使用的非常廣泛,點擊反饋、選中、使能、聚焦等狀態切換都會用到選擇器。
一:下面是一個簡單的選擇器:
android:enterFadeDuration="200" 、android:exitFadeDuration="200":進入新狀態或退出舊狀態時會有一個200毫秒的漸變動畫。這兩個屬性使用的比較常見,可以使選擇器的狀態切換更加平滑。
以下幾個都是Drawable的屬性。
android:autoMirrored="true"對應drawable.setAutoMirrored(),這個屬性表示是否將drawable鏡像顯示,只有在從右往左布局的環境下才會生效。將此屬性設置成true,並將語言調節成阿拉伯語便可以看到效果。
android:dither="true"對應drawable.setDither(),這個屬性表示是否對圖像進行抖動處理。當圖像的bit-color較少時,通過顏色值的抖動來增加可用顏色數量,並保持較好的顯示效果。
android:visible="true" 對應drawable.setVisible(),設置Drawable是否可見,一般不會影響Drawable的行為,但是它是Drawable是否運行了動畫的一個暗示。例如:AnimationDrawable可以通過這個方法啟動或者停止動畫。
剩下兩個屬性對應DrawableContainer$DrawableContainerState裡面的屬性(DrawableContainer是Drawable的一個子類,DrawableContainerState是DrawableContainer的內部類)。
android:constantSize="true":當選擇器各個狀態的圖片大小不一時,設置為 true表示以最大的圖片的尺寸顯示,設置為false以默認的圖片的尺寸顯示(控制項大小會對現象有影響,需要是包裹內容的)。
android:variablePadding="false" :默認為false,這個屬性意義不大,通常不去設置。
二:Item的各種狀態,理解起來相對簡單,都可以從屬性的名字去理解其含義,例如:
狀態為加速的時候會顯示ic_launcher_m圖片,那麼是什麼加速呢?這就需要自己去分析一下,其實這里指的加速是對View的軟體加速或硬體加速。
當給View設置background、foreground或ImageView設置src時只能寫android:drawable="id":
當給文字顏色添加選擇器的時候必須要寫android:color="ARGB|RGB顏色值"
三:注意安卓程序在讀取選擇器文件時,是從上往下一個一個節點進行遍歷的,程序會選擇符合當前控制項狀態的第一個Item的內容。如果一個Item不寫任何狀態,表示它任何狀態都符合, 所以一般最後一個Item是不會寫任何狀態的(就像if(){}else if(){}else{}語句一樣,最後一個包含了剩下的所有情況)。
四:選擇器的Item和animated-rotate一起使用。
五:動態創建選擇器
動態創建一個簡單的選擇器:
用一張圖片,通過對圖片的著色創建選擇器:
創建矢量圖選擇器:
TextView文字顏色選擇器:
部分常用狀態數組:
B. Android 13 適配指南
2022 的Google I/O 發布了 Android 13 beta 2 和 Android 13 Beta 1 國內廠商的設備支持列表,雖然按照慣例, Android 13 應該是年末才發布正式版,但是相信有的開發者已經收到了平台的 Android13 的適配要求,所以本篇也是結合 Oppo 的 Android 13 應用兼容性適配指導 和官方提供的一些文檔內容做一個整理測試。
目前 Android 13 主要的兼容問題還是在於隱私許可權上,所以本次的適配指南相關內容也是著重在這一部分, 這里涉及面比較廣的應該就是相冊和通知許可權 。
這個動圖大家可能看到過, 這是 Android 13 上提供的系統圖片選擇器,通過 Intent(MediaStore.ACTION_PICK_IMAGES); 就可以打開,支持視頻、音頻、圖片分類,支持多選和單選 ,另外官方也表示過,這個特性不僅僅會在 Android 13 中出現,谷歌還會將其放置到 Play 商店中,向 Android 11 和 Android 12 設備推送。
我們通過調整 TargetSDK 設置為 PreView ,然後運行到 Tiramisu 的模擬器上進行測試,主要測試 TargetSDK 在低於 "Tiramisu" 和等於 "Tiramisu" 時的不同情況。
如下圖所示:
總結: 所以如果是 TargetSDK 在 Android 13 以下,不需要處理,如果在 Android 13 以及以上 ,需要增加申請許可權 。
在 Android R 上設置里開始支持在設置里對應用的通知許可權進行管理,但是應用自身是無法修改應用級別的通知許可權,所以 App 無法知道自身有沒有發送通知的許可權
所以在 Android 13 里增加了通知的運行時許可權 ,其中 Android 13 (33) 的通知會根據正在運行的應用程序的目標 API 級別進行不同的處理, 不過不管應用程序的目標API級別如何,Android 13 都會提示用戶授予應用程序發送通知的許可權 。
例如下圖,是 targetSdk 30 運行在 Android 13 模擬器上,依然會彈出讓用戶是否允許推送 。
當然,系統也會根據應用程序的目標 API 級別處理通知訪問:
如果是 現有應用更新 ,程序的目標 API 級別為:
最後測試和總結一下:
由於 Android 之前可以通過跟蹤附近的 Wi-Fi AP 和藍牙設備來推斷設備的位置,所以這次谷歌決定禁止應用程序 訪問藍牙 結果,除非這類應用需要聲明 ACCESS_FINE_LOCATION 許可權。
在 Android 13 中,Google 將 Wi-Fi 掃描與位置相關內容分離, Android 13 為管理設備與周圍 Wi-Fi 熱點連接的應用添加 NEARBY_WIFI_DEVICES 運行時許可權 (屬於 NEARBY_DEVICES 許可權組),從而在不需要 ACCESS_FINE_LOCATION 許可權的情況下,也可以讓應用訪問附近的 Wi-Fi 設備。
此前,對於僅需要連接 Wi-Fi 設備,但實際上並不需要了解設備位置的應用來說,以 Android 13 (33)為目標平台的應用現在可以通過 「 neverForLocation 」 屬性來完善申請 NEARBY_WIFI_DEVICES 許可權。
這項新許可權會影響幾個不同的 Wi-Fi 用例,包括以下用例:
所以開發需要區分不同api對應的許可權;
由於 NEARBY_WIFI_DEVICES 許可權僅適用於 Android 13 或更高版本, 如果是 Android12L(32) 以及以下的 App 應保留對 ACCESS_FINE_LOCATION 的所有聲明:
以 Android 13(33) 為目標平台時,如果應用不會通過 Wi-Fi API 推導物理位置,請在清單文件中將 usesPermissionFlags 屬性設為 neverForLocation。
所以總結: 以 Android 13(33) 為目標平台的應用程序,訪問附近的 WI-FI 設備。除特例API需要申請ACCESS_FINE_LOCATION外,其他需要申請 android.permission.NEARBY_WIFI_DEVICES 運行時許可權 ;
Android 13 中引入了 「在使用時」 訪問身體感測器(例如心率、體溫和血氧飽和度)的概念,此訪問模式與 Android 10(API 級別 29)系統為位置信息 引入的模式非常相似。
如果你的 App 以 Android 13(33) 為目標平台,並且在後台運行時需要訪問身體感測器信息,那麼除了現有的 BODY_SENSORS 許可權外,還必須聲明新的 BODY_SENSORS_BACKGROUND 許可權 。
當 App 以 Android 13(33) 或更高版本為 Target 的其他應用的導出組件發送 intent 時,僅當該 intent 與接收應用中的 <intent-filter> 元素匹配時,系統才會傳送該 intent,換言之系統會屏蔽所有不匹配的 intent,但以下情況除外:
為了幫助提高運行時接收器的安全性,Android 13 允許你指定 App 中的特定廣播接收器是否應被導出以及是否對設備上的其他應用可見,此變更是 Android 12 更安全的組件 的延續;
以 Android 13(33) 或更高版本為目標平台的應用,必須為每個廣播接收器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED ,否則當 App 嘗試注冊廣播接收器時,系統會拋出 SecurityException
在 Android 13中,谷歌添加了一個新的API,允許開發者降級許可權。
應用程序可以觸發撤銷授予調用 API 的包的一個或多個運行時許可權,不需要訪問特定運行時許可權控制 API 的應用程序可以自行撤銷這些許可權,這樣用戶就可以確保這些應用程序不會在不知情的情況下使用這些API。
如需撤消特定運行時許可權,請將該許可權的名稱傳入 revokeOwnPermissionOnKill() 方法,如需同時撤消一組運行時許可權,請將這組許可權的名稱傳入 revokeOwnPermissionsOnKill() 。
系統只有在安全的情況下才會觸發撤消操作,也就是當有應用組件仍在前台運行,或者有另一個應用正在訪問你應用的組件(如 content provider)時不會發生撤消。
Android 之前一直提供了一個剪貼板服務,所有 App 都可以使用它來放置和檢索文本。
盡管從技術上講,任何應用都可以清除全局剪貼板中的主內容(只要它們是前台應用或 Android 10+ 上的默認輸入法),但 Android 本身不會自動清除剪貼板。
這意味著任何留在全局剪貼板中的剪貼板內容,都可以在以後被應用程序讀取,盡管 Android 的剪貼板訪問有 toast 消息可能會提醒用戶。
Android 13 增加了剪貼板自動清除功能,此功能在默認情況下處於禁用狀態,在經過設定的時間後,將自動從全局剪貼板中清除主剪輯, 默認情況下經過3600000毫秒(60分鍾)後,剪貼板將被清除。
每次執行復制/讀取(寫入剪貼板 setPrimaryClip ,讀 getPrimaryClip )時,會重置一個消息 timeout(60min),之後會自動清除剪貼板內存中的內容,即60min內,如果一直沒有寫入剪貼板的操作,剪貼板的內容會被自動清除。
Android 13 的新前台服務( Foreground Services:FGS)任務管理器顯示當前運行前台服務的應用程序列表,此列表稱為活動應用程序,可以通過下拉通知抽屜並點擊啟示來訪問,這時候每個應用程序旁邊都會有一個「停止」按鈕。
利用 JobScheler,應用可使用 JobInfo.Builder.setPrefetch() 將特定作業標記為「預提取」,這意味著理想情況下這些作業應該在應用下一次啟動前提前一點運行,以提升用戶體驗。
過去,JobScheler 僅使用該信號讓預提取作業有機會使用免費或多餘的數據,在 Android 13 中系統現在會嘗試確定應用下次啟動的時間,並根據該估算值運行預提取作業,應用應嘗試使用「預提取」來完成他們想要在下次應用啟動前完成的任何工作。
Android 13 中引入了 電池資源利用率 功能,以便為系統提供多種方法來更好地管理設備電池續航時間:
C. android 類似於微信朋友圈的照片選擇器怎麼做
微信朋友圈如果出現顯示不了圖片,可以通過以下方式排除: 一、網路是不是正常的,建議換個網路試下; 二、如果網路正常,建議清除微信緩存,步驟:設置---通用---清理微信存儲空間; 三、清除緩存還未解決,請退出微信當前帳號,同時將手機重啟,再次登陸微信一般就可以解決了;
D. android galleryfinal 怎麼樣
GalleryFinal是一個圖片選擇(單選/多選)、拍照、編輯、裁剪及旋轉為一身的圖片選擇器。使用方便,功能可自己配置,GalleryFinal還可以根據開發者的喜好來選擇主題,當然也支持自定義主題。而且GalleryFinal自身並沒有強制綁定某個ImageLoader,開發者可以根據自己項目給GalleryFinal配置圖片載入器。GalleryFinal還放棄了startActivityForResult+onActivityResult來獲取選擇結果,而是採用事件回調的機制。(我覺得startActivityForResult+onActivityResult太麻煩了,同意的點個贊吧,呵呵~)。GalleryFinal經過三四個月的版本迭代,修復bug,優化需求,已經處於穩定的狀態。
E. 【基礎筆記】Android Studio拍照、選擇相冊(第三方框架)
①選擇指定後綴文件
②在圖片選擇器中選擇圖片或視頻
③接受返回的文件
FilePicker
①、添加依賴
②、Activity實現takephoto
③實例圖片
④Git地址
TakePhoto
F. android圖片按鈕點擊來回變化如何實現
加一個圖片選擇器的xml文檔,當按下時為圖片1,松開時為圖片2,然後設置ImageButton的android:background=「xml文件的路徑和文件名」
G. android 怎麼定義背景選擇器
關於listview和button都要改變android原來控制項的背景,在網上查找了一些資料不是很全,所以現在總結一下android的selector的用法。
首先android的selector是在drawable/xxx.xml中配置的。
先看一下listview中的狀態:
把下面的XML文件保存成你自己命名的.xml文件(比如list_item_bg.xml),在系統使用時根據ListView中的列表項的狀態來使用相應的背景圖片。
drawable/list_item_bg.xml
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas。android。com/apk/res/android">
<!-- 默認時的背景圖片 -->
<item android:drawable="@drawable/pic1" />
<!-- 沒有焦點時的背景圖片 -->
<item android:state_window_focused="false" android:drawable="@drawable/pic1" />
<!-- 非觸摸模式下獲得焦點並單擊時的背景圖片 -->
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/pic2" />
<!-- 觸摸模式下單擊時的背景圖片 -->
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/pic3" />
<!--選中時的圖片背景 -->
<item android:state_selected="true" android:drawable="@drawable/pic4" />
<!--獲得焦點時的圖片背景 -->
<item android:state_focused="true" android:drawable="@drawable/pic5" />
</selector>
使用些xml文件:第一種是在listview中配置android:listSelector="@drawable/list_item_bg"
或者在listview的item中添加屬性android:background=「@drawable/list_item_bg"即可實現,或者在java代碼中使用:Drawable drawable = getResources().getDrawable(R.drawable.list_item_bg);
ListView.setSelector(drawable);同樣的效果。
但是這樣會出現列表有時候為黑的情況,需要加上:android:cacheColorHint="@android:color/transparent"
使其透明。
其次再來看看Button的一些背景效果:
android:state_selected是選中
android:state_focused是獲得焦點
android:state_pressed是點擊
android:state_enabled是設置是否響應事件,指所有事件
根據這些狀態同樣可以設置button的selector效果。也可以設置selector改變button中的文字狀態。
以下就是配置button中的文字效果:
drawable/button_font.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas、android、com/apk/res/android">
<item android:state_selected="true" android:color="#FFF" />
<item android:state_focused="true" android:color="#FFF" />
<item android:state_pressed="true" android:color="#FFF" />
<item android:color="#000" />
</selector>
Button還可以實現更復雜的效果,例如漸變啊等等。
drawable/button_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http;//schemas。android。com/apk/res/android">
<item android:state_pressed="true">
<!-- 定義當button 處於pressed 狀態時的形態。 -->
<shape>
<gradient android:startColor="#8600ff" />
<stroke android:width="2dp" android:color="#000000" />
<corners android:radius="5dp" />
<padding android:left="10dp" android:top="10dp"
android:bottom="10dp" android:right="10dp" />
</shape>
</item>
<item android:state_focused="true">
<!-- 定義當button獲得 focus時的形態 -->
<shape>
<gradient android:startColor="#eac100" />
<stroke android:width="2dp" android:color="#333333" color="#ffffff" />
<corners android:radius="8dp" />
<padding android:left="10dp" android:top="10dp"
android:bottom="10dp" android:right="10dp" />
</shape>
</item>
</selector>
最後,需要在包含 button的xml文件里添加兩項。假如是 main.xml 文件,我們需要在<Button />里加兩項。
android:focusable="true"
android:backgroud="@drawable/button_color"
這樣當你使用Button的時候就可以甩掉系統自帶的那黃顏色的背景了,實現個性化的背景,配合應用的整體布局非常之有用啊。
H. android 自定義圖片選擇器,怎麼篩選圖片
偽代碼如下:
private boolean flag;
public void onClick(View v){
if(flag){
mImageView.setImageResource(R.drawable.xx1);
}else{
mImageView.setImageResource(R.drawable.xx2);
}
flag = !flag;
}123456789123456789
筆者連上面的代碼知道寫出來那為什麼還要去自定義一個ImageView了?
具體需求:兩個ImageView之間實現單選效果
我們試想下,目前兩個ImageView通過上面的代碼可能還好,只要在不同的事件中做出不同的判斷就好了,但如果一但ImageView增多了了?
A:你不知道用 RadioGroup+RadioButton 啊!
B:是哦!我現在去試下。
……
B:不行啊,雖然RadioButton可以實現,但不好做適配,我為RadioButton設置Drawable,不能居中,而且不能隨著RadioButton的大小改變而改變,資源圖片是多大就多大,顯示區域不夠就不能完全顯示出來。
A:…?,額,是嗎?這樣啊!那我們就自定義一個ImageView來實現吧!
B:為什麼是自定義ImageView?而不是自定義RadioButton?
A:自定義RadioButton實現ImageView的src屬性比較復雜(等著正在看這博客的大神實現),而自定義ImageView來實現單選的屬性比較好實現。
B:那怎麼實現了?
A:看代碼,代碼如下:
attrs.xml <為自定義ImageView添加兩個屬性>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SelectorImageView">
<attr name="selector_src" format="reference"/>//選中的src圖片屬性
<attr name="checked" format="boolean"/>
</declare-styleable>
</resources>12345671234567
Class - SelectorImageView<此類實現了Checkable介面,這里沒什麼特殊功能,而只是利用此介面中的方法而已,不實現我們也可以自己寫>
public class SelectorImageView extends ImageView implements Checkable {
private boolean isChecked;
private Drawable mSelectorDrawable;
private Drawable mDrawable;
public SelectorImageView(Context context) {
this(context, null);
}
public SelectorImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SelectorImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
/**獲取默認屬性src的Drawable並用成員變數保存*/
mDrawable = getDrawable();
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SelectorImageView);
/**獲取自定義屬性selector_src的Drawable並用成員變數保存*/
Drawable d = a.getDrawable(R.styleable.SelectorImageView_selector_src);
mSelectorDrawable = d;
/**獲取自定義屬性checked的值並用成員變數保存*/
isChecked = a.getBoolean(R.styleable.SelectorImageView_checked, false);
setChecked(isChecked);
if (d != null && isChecked) {
/**如果在布局中設置了selector_src與checked = true,我們就要設置ImageView的圖片為mSelectorDrawable */
setImageDrawable(d);
}
a.recycle();
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
}
@Override
public void setChecked(boolean checked) {
this.isChecked = checked;
}
@Override
public boolean isChecked() {
return isChecked;
}
@Override
public void toggle() {
/**此處依據是否選中來設置不同的圖片*/
if (isChecked()) {
setImageDrawable(mSelectorDrawable);
} else {
setImageDrawable(mDrawable);
}
}
public void toggle(boolean checked){
/**外部通過調用此方法傳入checked參數,然後把值傳入給setChecked()方法改變當前的選中狀態*/
setChecked(checked);
toggle();
}
}
layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.qjay.adf.widget.SelectorImageView
android:id="@+id/iv"
android:layout_width="100dp"
android:layout_height="100dp"
app:selector_src="@mipmap/checked"
android:src="@mipmap/no_checked"/>
</LinearLayout>12345678910111234567891011
Activity Code
public class MainActivity extends Activity {
private SelectorImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (SelectorImageView) findViewById(R.id.iv);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
iv.toggle(!iv.isChecked());
}
});
}
}
I. Android編程 打開本地文件 文件選擇器
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/b01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/iv01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
代碼
import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class Lesson_01_Pic extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.b01);
button.setText("選擇圖片");
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
/* 開啟Pictures畫面Type設定為image */
intent.setType("image/*");
/* 使用Intent.ACTION_GET_CONTENT這個Action */
intent.setAction(Intent.ACTION_GET_CONTENT);
/* 取得相片後返回本畫面 */
startActivityForResult(intent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Log.e("uri", uri.toString());
ContentResolver cr = this.getContentResolver();
try {
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
ImageView imageView = (ImageView) findViewById(R.id.iv01);
/* 將Bitmap設定到ImageView */
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
Log.e("Exception", e.getMessage(),e);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
J. android圖片選擇器百葉窗切換效果怎麼實現
在網頁上js上,大都有這效果,是在不行,也可以去網上查看代碼,然後再flash上自己做。*****看本版的精華,你就明白了.---->