我的Android进阶之旅------>自己写个Activity来调节Android系统背光亮度Brightness
今天终于算初步写好了一个调节系统背光亮度Brightness的代码,本来不看Android源代码以为可以直接调用某个Action来启动系统的那个调节Brightness的对话框,但是看了代码后发现系统调节Brightness的自定义组件BrightnessPreference继承了SeekBarDialogPreference,但是最终父类还是Preference,因此不能够单独启动,必须得将这个自定义的BrightnessPreference用某个Activity才能加载过来,毕竟最终还是一个组件。因此,将系统的BrightnessPreference改写成Activity的形式,然后将Activity的主题设置为对话框的主题即可。
下图是系统自带的对话框,我的Activity就是仿造这个界面做的。
下面是我改写完后的代码,可以和系统设置的背光设置进行同步,即数据同步,无论是使用自己的Activity还是系统自带的调节背光的亮度,都是一样的效果。代码在Eclipse中运行可能会报错,但是别怕,使用Android编译能通过,然后push到Android设备中去运行没有错误。
代码如下:BrightnessDialogActivity.java
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.os.IPowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.SeekBar; import com.android.settings.R;
import com.canplay.systemui.QuickSettings;
import com.canplay.util.DLog; /**
* @author ouyangpeng
*/
public class BrightnessDialogActivity extends Activity implements
SeekBar.OnSeekBarChangeListener, OnClickListener {
private static String TAG="@@@@@@@@@@@@Brightness---->";
private SeekBar mSeekBar;
private CheckBox mCheckBox;
private Button btnCancel;
private Button btnSure; private int mOldBrightness;
private int mOldAutomatic; private boolean mAutomaticAvailable;
private boolean mAutomaticMode; private int mCurBrightness = -1; private boolean mRestoredOldState; // Backlight range is from 0 - 255. Need to make sure that user
// doesn't set the backlight to 0 and get stuck private int mScreenBrightnessDim = android.os.PowerManager.BRIGHTNESS_DIM + 10; private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON; private static final int SEEK_BAR_RANGE = 10000; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.brightness_dialog_activity); getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),
true, mBrightnessObserver);
getContentResolver()
.registerContentObserver(
Settings.System
.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE),
true, mBrightnessModeObserver); mRestoredOldState = false; mAutomaticAvailable = true; /*
* mAutomaticAvailable = getResources() .getBoolean(
* com.android.internal.R.bool.config_automatic_brightness_available);
*/
// mAutomaticAvailable=getBrightnessMode(0)==Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; mSeekBar = (SeekBar) findViewById(R.id.brightnessSeekbar);
mSeekBar.setMax(SEEK_BAR_RANGE); mOldBrightness = getBrightness();
mSeekBar.setProgress(mOldBrightness); mCheckBox = (CheckBox) findViewById(R.id.brightness_automatic_mode);
// 重新读取配置信息
// onBrightnessChanged();
// onBrightnessModeChanged(); if (mAutomaticAvailable) {
mCheckBox
.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
: Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
mSeekBar.setProgress(getBrightness());
mSeekBar.setEnabled(!mAutomaticMode);
setBrightness(mSeekBar.getProgress(), false);
}
});
mOldAutomatic = getBrightnessMode(0);
mAutomaticMode = mOldAutomatic == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
mCheckBox.setChecked(mAutomaticMode);
mSeekBar.setEnabled(!mAutomaticMode);
} else {
mSeekBar.setEnabled(true);
} mSeekBar.setOnSeekBarChangeListener(this); btnSure = (Button) findViewById(R.id.btnSure);
btnSure.setOnClickListener(this);
btnCancel = (Button) findViewById(R.id.btnCancel);
btnCancel.setOnClickListener(this);
} private ContentObserver mBrightnessObserver = new ContentObserver(
new Handler()) {
@Override
public void onChange(boolean selfChange) {
mCurBrightness = -1;
onBrightnessChanged();
}
}; private ContentObserver mBrightnessModeObserver = new ContentObserver(
new Handler()) {
@Override
public void onChange(boolean selfChange) {
onBrightnessModeChanged();
}
}; private void onBrightnessChanged() {
mSeekBar.setProgress(getBrightness());
} private void onBrightnessModeChanged() {
boolean checked = getBrightnessMode(0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
mCheckBox.setChecked(checked);
mSeekBar.setProgress(getBrightness());
mSeekBar.setEnabled(!checked);
} private int getBrightnessMode(int defaultValue) {
int brightnessMode = defaultValue;
try {
brightnessMode = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE);
} catch (SettingNotFoundException snfe) {
}
return brightnessMode;
} private int getBrightness() {
int mode = getBrightnessMode(0);
float brightness = 0;
if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
brightness = Settings.System.getFloat(getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0);
brightness = (brightness + 1) / 2;
} else {
if (mCurBrightness < 0) {
brightness = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, 100);
} else {
brightness = mCurBrightness;
}
brightness = (brightness - mScreenBrightnessDim)
/ (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);
}
return (int) (brightness * SEEK_BAR_RANGE);
} @Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
setBrightness(progress, false);
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) { } private void setMode(int mode) {
mAutomaticMode = mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
Settings.System.putInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE, mode);
} private void setBrightness(int brightness, boolean write) {
if (mAutomaticMode) {
float valf = (((float) brightness * 2) / SEEK_BAR_RANGE) - 1.0f;
try {
IPowerManager power = IPowerManager.Stub
.asInterface(ServiceManager.getService("power"));
if (power != null) {
power.setAutoBrightnessAdjustment(valf);
}
if (write) {
final ContentResolver resolver = getContentResolver();
Settings.System.putFloat(resolver,
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
valf);
}
} catch (RemoteException doe) {
}
} else {
int range = (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);
brightness = (brightness * range) / SEEK_BAR_RANGE
+ mScreenBrightnessDim;
try {
IPowerManager power = IPowerManager.Stub
.asInterface(ServiceManager.getService("power"));
if (power != null) {
power.setBacklightBrightness(brightness);
}
if (write) {
mCurBrightness = -1;
final ContentResolver resolver = getContentResolver();
Settings.System.putInt(resolver,
Settings.System.SCREEN_BRIGHTNESS, brightness);
} else {
mCurBrightness = brightness;
}
} catch (RemoteException doe) {
}
}
} private void restoreOldState() {
if (mRestoredOldState)
return; if (mAutomaticAvailable) {
setMode(mOldAutomatic);
}
setBrightness(mOldBrightness, false);
mRestoredOldState = true;
mCurBrightness = -1;
} @Override
public void onClick(View v) {
final ContentResolver resolver = getContentResolver();
if (v == findViewById(R.id.btnSure)) {
setBrightness(mSeekBar.getProgress(), true);
this.finish();
} else if (v == findViewById(R.id.btnCancel)) {
restoreOldState();
this.finish();
}
resolver.unregisterContentObserver(mBrightnessObserver);
resolver.unregisterContentObserver(mBrightnessModeObserver);
}
}
相应的布局文件如下:brightness_dialog_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingBottom="20dip" > <ImageView
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:paddingTop="20dip"
android:visibility="gone" /> <CheckBox
android:id="@+id/brightness_automatic_mode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="6dip"
android:text="@string/automatic_brightness"
android:textAppearance="?android:attr/textAppearanceSmall" /> <SeekBar
android:id="@+id/brightness_seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dip" /> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <Button
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/cancel"
android:layout_gravity="center" /> <Button
android:id="@+id/btn_sure"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/sure"
android:layout_gravity="center" />
</LinearLayout>
</LinearLayout> </ScrollView>
注册Activity的时候使用下面的主题
android:theme="@android:style/Theme.Holo.Dialog"
但是有个bug,即调用系统的应用调节背光的时候,Seekbar的值和复选框是否被勾中在我的自定义Activity中的Seekbar的值和复选框是否被勾中同步,但是反过来就不行了。
再次读取系统的BrightnessPreference发现是因为没有去进行更新操作。因此得修改Android的源代码,重新编译后才能达到两边数据随便那边修改后,两边的数据都同步。
修改如下所示,修改前BrightnessPreference.showDialog(Bundle state)
@Override
protected void showDialog(Bundle state) {
super.showDialog(state); getContext().getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true,
mBrightnessObserver); getContext().getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), true,
mBrightnessModeObserver);
mRestoredOldState = false;
}
修改后BrightnessPreference.showDialog(Bundle state),即打开对话框的时候重新去读取数据库里面的Brightness的值和复选框是否被选中的值。
@Override
protected void showDialog(Bundle state) {
super.showDialog(state); getContext().getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true,
mBrightnessObserver); getContext().getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), true,
mBrightnessModeObserver);
onBrightnessChanged();
onBrightnessModeChanged();
mRestoredOldState = false;
}
====================================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng
===================================================================================
最后附上系统调节Brightness的代码
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package com.android.settings; import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.os.IPowerManager;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.preference.SeekBarDialogPreference;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.SeekBar; public class BrightnessPreference extends SeekBarDialogPreference implements
SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener { private SeekBar mSeekBar;
private CheckBox mCheckBox; private int mOldBrightness;
private int mOldAutomatic; private boolean mAutomaticAvailable;
private boolean mAutomaticMode; private int mCurBrightness = -1; private boolean mRestoredOldState; // Backlight range is from 0 - 255. Need to make sure that user
// doesn't set the backlight to 0 and get stuck
private int mScreenBrightnessDim =
getContext().getResources().getInteger(com.android.internal.R.integer.config_screenBrightnessDim);
private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON; private static final int SEEK_BAR_RANGE = 10000; private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
mCurBrightness = -1;
onBrightnessChanged();
}
}; private ContentObserver mBrightnessModeObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
onBrightnessModeChanged();
}
}; public BrightnessPreference(Context context, AttributeSet attrs) {
super(context, attrs); mAutomaticAvailable = context.getResources().getBoolean(
com.android.internal.R.bool.config_automatic_brightness_available); setDialogLayoutResource(R.layout.preference_dialog_brightness);
setDialogIcon(R.drawable.ic_settings_display);
} @Override
protected void showDialog(Bundle state) {
super.showDialog(state); getContext().getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true,
mBrightnessObserver); getContext().getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), true,
mBrightnessModeObserver);
onBrightnessChanged();
onBrightnessModeChanged();
mRestoredOldState = false;
} @Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view); mSeekBar = getSeekBar(view);
mSeekBar.setMax(SEEK_BAR_RANGE);
mOldBrightness = getBrightness();
mSeekBar.setProgress(mOldBrightness); mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);
if (mAutomaticAvailable) {
mCheckBox.setOnCheckedChangeListener(this);
mOldAutomatic = getBrightnessMode(0);
mAutomaticMode = mOldAutomatic == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
mCheckBox.setChecked(mAutomaticMode);
mSeekBar.setEnabled(!mAutomaticMode);
} else {
mSeekBar.setEnabled(true);
}
mSeekBar.setOnSeekBarChangeListener(this);
} public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromTouch) {
setBrightness(progress, false);
} public void onStartTrackingTouch(SeekBar seekBar) {
// NA
} public void onStopTrackingTouch(SeekBar seekBar) {
// NA
} public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
: Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
mSeekBar.setProgress(getBrightness());
mSeekBar.setEnabled(!mAutomaticMode);
setBrightness(mSeekBar.getProgress(), false);
} private int getBrightness() {
int mode = getBrightnessMode(0);
float brightness = 0;
if (false && mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
brightness = Settings.System.getFloat(getContext().getContentResolver(),
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0);
brightness = (brightness+1)/2;
} else {
if (mCurBrightness < 0) {
brightness = Settings.System.getInt(getContext().getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, 100);
} else {
brightness = mCurBrightness;
}
brightness = (brightness - mScreenBrightnessDim)
/ (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);
}
return (int)(brightness*SEEK_BAR_RANGE);
} private int getBrightnessMode(int defaultValue) {
int brightnessMode = defaultValue;
try {
brightnessMode = Settings.System.getInt(getContext().getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE);
} catch (SettingNotFoundException snfe) {
}
return brightnessMode;
} private void onBrightnessChanged() {
mSeekBar.setProgress(getBrightness());
} private void onBrightnessModeChanged() {
boolean checked = getBrightnessMode(0)
== Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
mCheckBox.setChecked(checked);
mSeekBar.setProgress(getBrightness());
mSeekBar.setEnabled(!checked);
} @Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult); final ContentResolver resolver = getContext().getContentResolver(); if (positiveResult) {
setBrightness(mSeekBar.getProgress(), true);
} else {
restoreOldState();
} resolver.unregisterContentObserver(mBrightnessObserver);
resolver.unregisterContentObserver(mBrightnessModeObserver);
} private void restoreOldState() {
if (mRestoredOldState) return; if (mAutomaticAvailable) {
setMode(mOldAutomatic);
}
setBrightness(mOldBrightness, false);
mRestoredOldState = true;
mCurBrightness = -1;
} private void setBrightness(int brightness, boolean write) {
if (mAutomaticMode) {
if (false) {
float valf = (((float)brightness*2)/SEEK_BAR_RANGE) - 1.0f;
try {
IPowerManager power = IPowerManager.Stub.asInterface(
ServiceManager.getService("power"));
if (power != null) {
power.setAutoBrightnessAdjustment(valf);
}
if (write) {
final ContentResolver resolver = getContext().getContentResolver();
Settings.System.putFloat(resolver,
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, valf);
}
} catch (RemoteException doe) {
}
}
} else {
int range = (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);
brightness = (brightness*range)/SEEK_BAR_RANGE + mScreenBrightnessDim;
try {
IPowerManager power = IPowerManager.Stub.asInterface(
ServiceManager.getService("power"));
if (power != null) {
power.setBacklightBrightness(brightness);
}
if (write) {
mCurBrightness = -1;
final ContentResolver resolver = getContext().getContentResolver();
Settings.System.putInt(resolver,
Settings.System.SCREEN_BRIGHTNESS, brightness);
} else {
mCurBrightness = brightness;
}
} catch (RemoteException doe) {
}
}
} private void setMode(int mode) {
mAutomaticMode = mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
Settings.System.putInt(getContext().getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE, mode);
} @Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (getDialog() == null || !getDialog().isShowing()) return superState; // Save the dialog state
final SavedState myState = new SavedState(superState);
myState.automatic = mCheckBox.isChecked();
myState.progress = mSeekBar.getProgress();
myState.oldAutomatic = mOldAutomatic == 1;
myState.oldProgress = mOldBrightness;
myState.curBrightness = mCurBrightness; // Restore the old state when the activity or dialog is being paused
restoreOldState();
return myState;
} @Override
protected void onRestoreInstanceState(Parcelable state) {
if (state == null || !state.getClass().equals(SavedState.class)) {
// Didn't save state for us in onSaveInstanceState
super.onRestoreInstanceState(state);
return;
} SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
mOldBrightness = myState.oldProgress;
mOldAutomatic = myState.oldAutomatic ? 1 : 0;
setMode(myState.automatic ? 1 : 0);
setBrightness(myState.progress, false);
mCurBrightness = myState.curBrightness;
} private static class SavedState extends BaseSavedState { boolean automatic;
boolean oldAutomatic;
int progress;
int oldProgress;
int curBrightness; public SavedState(Parcel source) {
super(source);
automatic = source.readInt() == 1;
progress = source.readInt();
oldAutomatic = source.readInt() == 1;
oldProgress = source.readInt();
curBrightness = source.readInt();
} @Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(automatic ? 1 : 0);
dest.writeInt(progress);
dest.writeInt(oldAutomatic ? 1 : 0);
dest.writeInt(oldProgress);
dest.writeInt(curBrightness);
} public SavedState(Parcelable superState) {
super(superState);
} public static final Parcelable.Creator<SavedState> CREATOR =
new Parcelable.Creator<SavedState>() { public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
} public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
}
我的Android进阶之旅------>自己写个Activity来调节Android系统背光亮度Brightness的更多相关文章
- 我的Android进阶之旅------>怎样将Activity变为半透明的对话框?
我的Android进阶之旅------>怎样将Activity变为半透明的对话框?能够从两个方面来考虑:对话框和半透明. 在定义Activity时指定Theme.Dialog主题就能够将Acti ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...
- 我的Android进阶之旅------>Android字符串资源中的单引號问题error: Apostrophe not preceded by 的解决的方法
刚刚在string字符串资源文件里,写了一个单引號.报错了,错误代码例如以下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资 ...
- 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:
我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...
- 我的Android进阶之旅------>Android字符串资源中的单引号问题error: Apostrophe not preceded by 的解决办法
刚刚在string字符串资源文件中,写了一个单引号,报错了,错误代码如下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资源文 ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- 我的Android进阶之旅------>关于调用Webservice查询火车票时刻表的几个接口介绍
今天发现一个可以提供火车票时刻表查询的WebService,先记录下来以后如果写一个火车票时刻表查询的Android App的话就用的着.首先该WebService的的名字是TrainTimeWebS ...
- 我的Android进阶之旅------>怎样解决Android 5.0中出现的警告: Service Intent must be explicit:
我的Android进阶之旅-->怎样解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...
- [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...
随机推荐
- 洛谷 P4256 公主の#19准备月考
题目背景 公主在玩完游戏后,也要月考了.(就算是公主也要月考啊QWQ) 题目描述 公主的文综太差了,全校排名1100+(全校就1100多人),她分析了好久,发现她如果把所有时间放在选择题上,得分会比较 ...
- shell date获取时间值
使用Shell获取上一个月.星期的时间范围 #!/bin/bash date_today=`date -d '1 day ago' +%Y%m%d` #最近7天 date_befor_7day=` ...
- C#获取程序所在的目录
有的时候,我们需要读取程序所在目录下的一些文件,最常见的写法是直接通过".\xxx.file"之类的相对路径来获取文件.虽然这种写法大多数的时候能正确工作,但却又一个很大的隐患:程 ...
- Storage protocol stacks
http://brasstacksblog.typepad.com/brass-tacks/ http://brasstacksblog.typepad.com/brass-tacks/2016/02 ...
- 键盘弹出后上提view隐藏后下拉view还原并修改scroll过程中旋转屏幕到竖屏view显示错误
1,注册键盘相应事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillSho ...
- CentOS 挂载NTFS分区的两种方法
第一种是安装内核模块,可到 http://sourceforge.net/projects/linux-ntfs/files/ 下载,需下载与你系统内核想对应的版本,使用uname -a 查看当前内核 ...
- 慕课网python进阶函数式编程学习记录
函数 不等于 函数式 函数: function 函数式: functional,一种编程范式 就好比计算机 不等于 计算 c语言: 函数 python :函数式(计算) 函数式编程特点: 把计算视为函 ...
- SEO误区之——静态化页面
你随便去找一个做SEO的人或者一个公司,他百分之百会让你把网页弄成纯静态页面,然后告诉你这样对搜索引擎是如何如何地好,那么我告诉你,这个做 SEO的,肯定不专业. 网页静态化这个东西,纯属以讹传讹的事 ...
- GIS可视化——热点图
一.简介 SuperMap iClient for JavaScript提供了热点图(HeatMapLayer),用于渲染数据衰减趋势.颜色渐变的效果. 原理:在客户端直接渲染的栅格图,热点图的渲染需 ...
- Linux后台进程管理(转)
fg.bg.jobs.&.ctrl + z命令一. &加在一个命令的最后,可以把这个命令放到后台执行 ,如gftp &,二.ctrl + z可以将一个正在前台执行的命令放到后台 ...