在很多手机软件中都存在一些图片的展示和自定义图片背景,下面就来实现下
布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/setting_title"
android:layout_width="fill_parent"
android:layout_height="@dimen/workspace_title_height"
android:background="@color/setting_actionbar" >
<ImageView
android:id="@+id/background_list_backImage"
android:layout_width="48dip"
android:layout_height="48dip"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:padding="8dip"
android:src="@drawable/activity_back"
android:background="@drawable/activity_onclick_selector"/>
<TextView
android:id="@+id/background_list_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/background_list_backImage"
android:gravity="center_horizontal"
android:text="@string/change_background"
android:textColor="@color/white"
android:textSize="18dip" />
</RelativeLayout>
<GridView
android:id="@+id/background_lis_gridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:horizontalSpacing="5dp"
android:numColumns="3"
android:padding="10dip"
android:scrollbars="none"
android:verticalSpacing="10dp" >
</GridView>
</LinearLayout>
创建一个活动名为BackgroundListActivity
public class BackgroundListActivity extends Activity {
private static final int TAKE_PICTURE = 0;
private static final int RESULT_LOAD_IMAGE = 1;
private File sdcardTempFile;
private String mWeather;
private String mPhotoPath;
private GridView gridView;
private ImageView backgroundBack;
private GridViewBackgroundAdapter adapter;
//天气背景图片
private int[] list = { R.drawable.bg_sunny_day, R.drawable.bg_sunny_night,
R.drawable.bg_cloudy_day, R.drawable.bg_cloudy_night,
R.drawable.bg_snow_day, R.drawable.bg_snow_night,
R.drawable.bg_ice_rain, R.drawable.bg_cloudy_sky,
R.drawable.bg_foggy_day, R.drawable.bg_rain_day,
R.drawable.bg_thunder_shower, R.drawable.bg_no_data };
//屏幕的高
private int mScreenHeight;
//屏幕的宽
private int mScreenWidth;
//点击的位置
private int location;
//存储背景的首选项
private PreferenceWeatherBackground pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.background_list_activity);
Display display = getWindowManager().getDefaultDisplay();
mScreenHeight = display.getHeight();
mScreenWidth = display.getWidth();
//拍照存储图片的文件夹
mWeather = FileUtil.getSDPath() + "/" + "weather_camera";
File dir = new File(mWeather);
if (!dir.exists()) {
dir.mkdirs();
}
pb = new PreferenceWeatherBackground(this);
initView();
initEvent();
}
private void initView() {
gridView = (GridView) findViewById(R.id.background_lis_gridView);
backgroundBack = (ImageView) findViewById(R.id.background_list_backImage);
//适配器
adapter = new GridViewBackgroundAdapter(list, this, mScreenHeight,
mScreenWidth);
gridView.setAdapter(adapter);
}
private void initEvent() {
//返回键
backgroundBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
//item的点击事件
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
location = position;
Log.i("jjf", "location111:" + location);
showCustomDailog(adapter.getWeatherName(position));
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PICTURE:// 照相
if (resultCode != -1)
return;
savePath(location, mPhotoPath);
adapter.setImag(gridView, location);
break;
case RESULT_LOAD_IMAGE:// 相册
if (resultCode != -1)
return;
Uri selectedImageUri = data.getData();
if (selectedImageUri == null)
return;
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImageUri,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
savePath(location, picturePath);
adapter.setImag(gridView, location);
break;
}
}
private void savePath(int loc, String path) {
switch (loc) {
case 0:
pb.saveSunnyDay(path);// 晴-白天
break;
case 1:
pb.saveSunnyNight(path);// 晴-晚上
break;
case 2:
pb.saveCloudyDay(path);// 多云-白天
break;
case 3:
pb.saveCloudyNight(path);// 多云-晚上
break;
case 4:
pb.saveSnowDay(path);// 雪-白天
break;
case 5:
pb.saveSnowNight(path);// 雪-晚上
break;
case 6:
pb.saveFreezingRain(path);// 冻雨
break;
case 7:
pb.saveCloudy(path);// 阴
break;
case 8:
pb.saveFog(path);// 雾
break;
case 9:
pb.saveRain(path);// 雨
break;
case 10:
pb.saveThunderShower(path);// 雷阵雨
break;
case 11:
pb.saveNoIdea(path);// 未知天气
break;
}
}
private String getPath(int loc) {
String path = "";
switch (loc) {
case 0:
path = pb.getSunnyDay();// 晴-白天
break;
case 1:
path = pb.getSunnyNight();// 晴-晚上
break;
case 2:
path = pb.getCloudyDay();// 多云-白天
break;
case 3:
path = pb.getCloudyNight();// 多云-晚上
break;
case 4:
path = pb.getSnowDay();// 雪-白天
break;
case 5:
path = pb.getSnowNight();// 雪-晚上
break;
case 6:
path = pb.getFreezingRain();// 冻雨
break;
case 7:
path = pb.getCloudy();// 阴
break;
case 8:
path = pb.getFog();// 雾
break;
case 9:
path = pb.getRain();// 雨
break;
case 10:
path = pb.getThunderShower();// 雷阵雨
break;
case 11:
path = pb.getNoIdea();// 未知天气
break;
}
return path;
}
//拍照,从相册获取照片的对话框
private void showCustomDailog(String name) {
//获取所点击位置的名字
final String imageName = name;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getResources().getString(
R.string.change_weather_background)
+ name);
//引用了一个布局
final View view = getLayoutInflater().inflate(R.layout.custom_dailog,
null);
LinearLayout mPicture = (LinearLayout) view
.findViewById(R.id.take_a_picture);
LinearLayout mPhoto = (LinearLayout) view
.findViewById(R.id.select_a_photo);
LinearLayout mDefault = (LinearLayout) view
.findViewById(R.id.restore_defaults);
builder.setView(view);
builder.setNegativeButton(
getResources().getString(R.string.dialog_cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
final AlertDialog dialog = builder.create();
dialog.show();
mPicture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {// 拍照
takePicture(imageName);
dialog.dismiss();
}
});
mPhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {// 选择照片
selectPhoto();
dialog.dismiss();
}
});
mDefault.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {// 恢复默认
if (!getPath(location).equals("")) {
savePath(location, "");
adapter.setImag(gridView, location);
}
dialog.dismiss();
}
});
}
private void takePicture(String str) {
mPhotoPath = FileUtil.getSDPath() + "/" + "weather_camera/" + str
+ ".jpg";
sdcardTempFile = new File(mPhotoPath);
if (!sdcardTempFile.exists()) {
try {
sdcardTempFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(sdcardTempFile));
startActivityForResult(intent, TAKE_PICTURE);
}
private void selectPhoto() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
startActivityForResult(intent, RESULT_LOAD_IMAGE);
}
}
适配器如下:
public class GridViewBackgroundAdapter extends BaseAdapter {
//默认图片数组
private int[] mImages;
private Context context;
private LayoutInflater inflater;
//文字列表
private String[] list;
private int Height;
private int Width;
//存储图片的首选项
private PreferenceWeatherBackground pb;
public GridViewBackgroundAdapter(int[] mImages, Context context,
int mScreenHeight, int mScreenWidth) {
super();
this.mImages = mImages;
this.context = context;
//item的高
Height = (mScreenHeight - 60) / 3;
//item的宽
Width = (mScreenWidth - 20) / 3;
inflater = LayoutInflater.from(context);
//从资源文件中获取文字列表
list = context.getResources().getStringArray(R.array.weatherRegime);
//首选项
pb = new PreferenceWeatherBackground(context);
}
@Override
public int getCount() {
return mImages.length;
}
@Override
public Object getItem(int position) {
return mImages[position];
}
@Override
public long getItemId(int position) {
return position;
}
public String getWeatherName(int position) {
return list[position];
}
//刷新单个item
public void setImag(GridView grid, int position) {
if (position >= grid.getFirstVisiblePosition()
&& position <= grid.getLastVisiblePosition()) {
View view = grid.getChildAt(position
- grid.getFirstVisiblePosition());
ImageView image = (ImageView) view
.findViewById(R.id.gridview_lsit_item_imageView);
//判断路径是否为空
if (!getImagePath(position).equals("")) {
//判断拍照或选择图片的路径的文件是否存在
if (FileUtil.isExist(getImagePath(position))) {
//imageloader异步加载图片
ImageManager.loadImage("file://" + getImagePath(position),
image);
} else {
//imageloader异步加载图片
ImageManager.loadImage("drawable://" + mImages[position],
image);
}
} else {
//imageloader异步加载图片
ImageManager
.loadImage("drawable://" + mImages[position], image);
}
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(
R.layout.gridview_list_background_item, null);
holder.imageName = (TextView) convertView
.findViewById(R.id.gridview_lsit_item_textView);
holder.image = (ImageView) convertView
.findViewById(R.id.gridview_lsit_item_imageView);
LayoutParams para = holder.image.getLayoutParams();
para.height = Height;
para.width = Width;
holder.image.setLayoutParams(para);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (!getImagePath(position).equals("")) {
if (FileUtil.isExist(getImagePath(position))) {
ImageManager.loadImage("file://" + getImagePath(position),
holder.image);
} else {
ImageManager.loadImage("drawable://" + mImages[position],
holder.image);
}
} else {
ImageManager.loadImage("drawable://" + mImages[position],
holder.image);
}
holder.imageName.setText(list[position]);
return convertView;
}
public class ViewHolder {
public ImageView image;
public TextView imageName;
}
private String getImagePath(int i) {
switch (i) {
case 0:
return pb.getSunnyDay();
case 1:
return pb.getSunnyNight();
case 2:
return pb.getCloudyDay();
case 3:
return pb.getCloudyNight();
case 4:
return pb.getSnowDay();
case 5:
return pb.getSnowNight();
case 6:
return pb.getFreezingRain();
case 7:
return pb.getCloudy();
case 8:
return pb.getFog();
case 9:
return pb.getRain();
case 10:
return pb.getThunderShower();
case 11:
return pb.getNoIdea();
}
return "";
}
}
首选项PreferenceWeatherBackground
public class PreferenceWeatherBackground {
private static SharedPreferences preferences;
private Editor editor;
public static String SUNNY_DAY = "sunny_day";
public static String SUNNY_NIGHT = "sunny_night";
public static String CLOUDY_DAY = "cloudy_day";
public static String CLOUDY_NIGHT = "cloudy_night";
public static String SNOW_DAY = "snow_day";
public static String SNOW_NIGHT = "snow_night";
public static String FREEZING_RAIN = "freezing_rain";
public static String CLOUDY = "cloudy";
public static String FOG = "fog";
public static String RAIN = "rain";
public static String THUNDER_SHOWER = "thunder_shower";
public static String NO_IDEA = "no_idea";
private static PreferenceWeatherBackground pfWeather;
public PreferenceWeatherBackground(Context context) {
preferences = context.getSharedPreferences("DeskWeather_Setting",
Context.MODE_PRIVATE);
editor = preferences.edit();
}
//单例模式
public static PreferenceWeatherBackground getInstance() {
if (pfWeather == null) {
pfWeather = new PreferenceWeatherBackground(getApplicationContext(););
}
return pfWeather;
}
public void saveSunnyDay(String path) {// 晴-白天
editor.putString(SUNNY_DAY, path);
editor.commit();
}
public String getSunnyDay() {
return preferences.getString(SUNNY_DAY, "");
}
public void saveSunnyNight(String path) {// 晴-晚上
editor.putString(SUNNY_NIGHT, path);
editor.commit();
}
public String getSunnyNight() {
return preferences.getString(SUNNY_NIGHT, "");
}
public void saveCloudyDay(String path) {// 多云-白天
editor.putString(CLOUDY_DAY, path);
editor.commit();
}
public String getCloudyDay() {
return preferences.getString(CLOUDY_DAY, "");
}
public void saveCloudyNight(String path) {// 多云-晚上
editor.putString(CLOUDY_NIGHT, path);
editor.commit();
}
public String getCloudyNight() {
return preferences.getString(CLOUDY_NIGHT, "");
}
public void saveSnowDay(String path) {// 雪-白天
editor.putString(SNOW_DAY, path);
editor.commit();
}
public String getSnowDay() {
return preferences.getString(SNOW_DAY, "");
}
public void saveSnowNight(String path) {// 雪-晚上
editor.putString(SNOW_NIGHT, path);
editor.commit();
}
public String getSnowNight() {
return preferences.getString(SNOW_NIGHT, "");
}
public void saveFreezingRain(String path) {// 冻雨
editor.putString(FREEZING_RAIN, path);
editor.commit();
}
public String getFreezingRain() {
return preferences.getString(FREEZING_RAIN, "");
}
public void saveCloudy(String path) {// 阴
editor.putString(CLOUDY, path);
editor.commit();
}
public String getCloudy() {
return preferences.getString(CLOUDY, "");
}
public void saveFog(String path) {// 雾
editor.putString(FOG, path);
editor.commit();
}
public String getFog() {
return preferences.getString(FOG, "");
}
public void saveRain(String path) {// 雨
editor.putString(RAIN, path);
editor.commit();
}
public String getRain() {
return preferences.getString(RAIN, "");
}
public void saveThunderShower(String path) {// 雷阵雨
editor.putString(THUNDER_SHOWER, path);
editor.commit();
}
public String getThunderShower() {
return preferences.getString(THUNDER_SHOWER, "");
}
public void saveNoIdea(String path) {// 未知天气
editor.putString(NO_IDEA, path);
editor.commit();
}
public String getNoIdea() {
return preferences.getString(NO_IDEA, "");
}
}
资源名字列表values/arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="weatherRegime">
<item>晴-白天</item>
<item>晴-夜晚</item>
<item>多云-白天</item>
<item>多云-夜晚</item>
<item>雪-白天</item>
<item>雪-夜晚</item>
<item>冻雨</item>
<item>阴</item>
<item>雾</item>
<item>雨</item>
<item>雷阵雨</item>
<item>未知天气</item>
</string-array>
</resources>