• android有用的知识


    DownloadManager是Android为开发者提供的一个后台应用组件,它通过Http层进行文件的下载任务.
    1:使用
    首先要在AndroidManifest.xml中申请访问DownloadManager的权限

    添加一个下载任务:
    ContentValues values = new ContentValues();
    values.put(Downloads.URI, url);//指定下载地址
    values.put(Downloads.COOKIE_DATA, cookie);//如果下载Server需要cookie,设置cookie
    values.put(Downloads.VISIBILITY,Downloads.VISIBILITY_HIDDEN);//设置下载提示是否在屏幕顶部显示
    values.put(Downloads.NOTIFICATION_PACKAGE, getPackageName());//设置下载完成之后回调的包名
    values.put(Downloads.NOTIFICATION_CLASS, DownloadCompleteReceiver.class.getName());//设置下载完成之后负责接收的Receiver,这个类要继承BroadcastReceiver
    values.put(Downloads.DESTINATION,save_path);//设置下载到的路径,这个需要在Receiver里自行处理
    values.put(Downloads.TITLE,title);//设置下载任务的名称
    this.getContentResolver().insert(Downloads.CONTENT_URI, values);//将其插入到DownloadManager的数据库中,数据库会触发修改事件,启动下载任务

    2:如何为DownloadManager设置代理,比如Wap
    values.put(Downloads.PROXY_HOST,”10.0.0.172″);
    values.put(Downloads.PROXY_PORT,”80″);

    3:如何在下载过程中监听下载任务
    可以通过监听数据库来实现
    DownloadsChangeObserver mDownloadObserver=new DownloadsChangeObserver(Downloads.CONTENT_URI);
    private class DownloadsChangeObserver extends ContentObserver {
    public DownloadsChangeObserver(Uri uri) {
    super(new Handler());
    }
    @Override
    public void onChange(boolean selfChange) {
    //查询需要监听的字段
    //比如要监听实时下载进度,查看当前下载状态:是否已经断开,或者下载失败等等
    StringBuilder wherequery = new StringBuilder(Downloads.TITLE);
    wherequery.append(“=”);
    wherequery.append(“‘”);
    wherequery.append(mTitle);
    wherequery.append(“‘”);

    mDownloadCursor =mContext.getContentResolver().query(Downloads.CONTENT_URI, new String[] {Downloads.TITLE, Downloads.STATUS, Downloads.CURRENT_BYTES,}, wherequery.toString(), null,orderBy);
    int mSizeColunmId=mDownloadCursor.getColumnIndexOrThrow(Downloads.CURRENT_BYTES);
    mDownloadCursor.moveToFirst();
    int size=mDownloadCursor.getInt(mSizeColunmId);


    4:如何删除下载记录
    private void deleteHistory(String title)//删除掉指定名称的下载记录
    {
    StringBuilder whereDelete = new StringBuilder(Downloads.TITLE);
    whereDelete.append(“=”);
    whereDelete.append(“‘”);
    whereDelete.append(str);
    whereDelete.append(“‘”);
    this.getContentResolver().delete(Downloads.CONTENT_URI,whereDelete.toString(), null);
    }

    在Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行.
    方法: 在操作之前加入
    PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);

    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
    wakeLock.acquire();

    别忘了在操作完毕之后释放掉
    if (wakeLock != null) {

    wakeLock.release();
    wakeLock = null;
    }

    最近在做项目的时候,遇到这样的问题,我需要能够把整个application都杀死,找了半天都没有找到,后来问同事才知道答案。代码如下:
    view plaincopy to clipboardprint?

    ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    mActivityManager .restartPackage(context.getPackageName());

    在此做个记录,以备忘记!

    Android 获取系统中所有安装的APK的信

    private
    private void loadApps() {
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
    }
    public class AppsAdapter extends BaseAdapter {
    public AppsAdapter() {
    }
    public View getView(int position, View convertView, ViewGroup parent) {
    ImageView i;
    if (convertView == null) {
    i = new ImageView(Grid1.this);
    i.setScaleType(ImageView.ScaleType.FIT_CENTER);
    i.setLayoutParams(new GridView.LayoutParams(50, 50));
    } else {
    i = (ImageView) convertView;
    }
    ResolveInfo info = mApps.get(position);
    i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
    return i;
    }

    public final int getCount() {
    return mApps.size();
    }
    public final Object getItem(int position) {
    return mApps.get(position);
    }
    public final long getItemId(int position) {
    return position;
    }
    List mApps;

    安装完Android SDK后,默认会在C盘创建一个.Android的文件夹用来存放AVD.此时如果想修改AVD的路径,可以设置一个环境变量ANDROID_SDK_HOME=要设置的路径(比如:F:\Java\Android),重新启动Eclipse,修改成功!

    android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下:
    1、Drawable → Bitmap
    Java代码

    public static Bitmap drawableToBitmap(Drawable drawable) {

    Bitmap bitmap = Bitmap
    .createBitmap(
    drawable.getIntrinsicWidth(),
    drawable.getIntrinsicHeight(),
    drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
    : Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bitmap);
    //canvas.setBitmap(bitmap);
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    drawable.draw(canvas);
    return bitmap;
    }
    2、从资源中获取Bitmap
    Java代码

    Resources res=getResources();

    Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
    3、Bitmap → byte[]
    Java代码

    private byte[] Bitmap2Bytes(Bitmap bm){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return baos.toByteArray();
    }

    4、 byte[] → Bitmap

    Java代码

    private Bitmap Bytes2Bimap(byte[] b){
    if(b.length!=0){
    return BitmapFactory.decodeByteArray(b, 0, b.length);
    }
    else {
    return null;
    }
    }

    通过分析Launcher的生成快捷方式的过程,找出了使用Intent发送请求,Launcher通过自己注册的InstallShortCutReceiver和UnInstallShortCutReceiver实现了快捷方式图标的生成与移除过程。本文主要分析外部apk如何使用Intent请求生成快捷方式和移除快捷方式图标的问题。

    生成快捷方式代码:

    Java代码

    private static final String ACTION_INSTALL_SHORTCUT =
    “com.android.launcher.action.INSTALL_SHORTCUT”;

    /**
    * 是否可以有多个快捷方式的副本
    */
    static final String EXTRA_SHORTCUT_DUPLICATE = “duplicate”;

    Intent shortcutIntent = new Intent(ACTION_INSTALL_SHORTCUT);
    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,
    getString(R.string.app_name));
    shortcutIntent.putExtra(EXTRA_SHORTCUT_DUPLICATE, false);
    Intent intent2 = new Intent(Intent.ACTION_MAIN);
    intent2.addCategory(Intent.CATEGORY_LAUNCHER);

    intent2.setComponent(new ComponentName(this.getPackageName(),
    “.Main”));

    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent2);
    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
    Intent.ShortcutIconResource.fromContext(this,
    R.drawable.icon));
    sendBroadcast(shortcutIntent);

    注:Intent intent2 = new Intent(Intent.ACTION_MAIN); 这个也可以换成的构造参数也可以是Intent.ACTION_CREATE_SHORTCUT,也可以生成快捷方式图标,但是这样不标准,在删除的时候如果不和这个对于相同则无法删除。所以还是用Intent.ACTION_MAIN。

    那么删除快捷方式的代码是:
    Java代码

    private static final String ACTION_UNINSTALL_SHORTCUT =
    “com.android.launcher.action.UNINSTALL_SHORTCUT”;

    Intent intent = new Intent(ACTION_UNINSTALL_SHORTCUT );
    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
    ComponentName comp = new ComponentName(info.activityInfo.packageName,
    info.activityInfo.name);
    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent()
    .setComponent(comp).setAction(“android.intent.action.MAIN”));
    sendBroadcast(intent);

    常用的Android自定义主题

    android:theme="@android:style/Theme.Dialog"   将一个Activity显示为能话框模式
    android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏
    android:theme="Theme.Light"  背景为白色
    android:theme="Theme.Light.NoTitleBar"  白色背景并无标题栏 
    android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,无标题栏,全屏
    android:theme="Theme.Black"  背景黑色
    android:theme="Theme.Black.NoTitleBar"  黑色背景并无标题栏
    android:theme="Theme.Black.NoTitleBar.Fullscreen"    黑色背景,无标题栏,全屏
    android:theme="Theme.Wallpaper"  用系统桌面为应用程序背景
    android:theme="Theme.Wallpaper.NoTitleBar"  用系统桌面为应用程序背景,且无标题栏
    android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系统桌面为应用程序背景,无标题栏,全屏
    android:theme="Translucent"
    android:theme="Theme.Translucent.NoTitleBar"
    android:theme="Theme.Translucent.NoTitleBar.Fullscreen"
    android:theme="Theme.Panel"
    android:theme="Theme.Light.Panel"


    使用Intent调用系统的Camera程序的裁剪功能实现图片修剪。

      Intent intent = new Intent("com.android.camera.action.CROP");   
       intent.setClassName("com.android.camera", "com.android.camera.CropImage");  

      不过可能会出现无法找到Activity的android.content.ActivityNotFoundException异常,这是由于Android内部的gallery和camera都有处理,可以尝试另一种URI,com.android.gallery的com.android.camera.CropImage,在setClassName时,具体的代码为

    final Intent intent = new Intent("com.android.camera.action.CROP"); 
    intent.setClassName("com.android.camera", "com.android.camera.CropImage"); 
    intent.setData(Uri.fromFile(mFile)); 
    intent.putExtra("outputX", width); 
    intent.putExtra("outputY", height); 
    intent.putExtra("aspectX", width); 
    intent.putExtra("aspectY", height); 
    intent.putExtra("scale", true); 
    intent.putExtra("noFaceDetection", true); 
    intent.putExtra("output", Uri.parse("file:/" + mFile.getAbsolutePath())); 
    startActivityForResult(intent, REQUEST_CROP_IMAGE); 


    1.思路是通过自己构建KeyEvent对象来改变键的功能。

      例如,把所有的按键都改成“返回键”的功能,代码如下:

      //这里构建KeyEvent对象,其功能为返回键的功能
      //因此我们按任意键都会执行返回键功能
      KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);

      //这里传入的参数就是我们自己构建的KeyEvent对象key
      super.onKeyDown(key.getKeyCode(), key); 

    至此OK

      控件事件是通过(setOnClickListener)设置其控件的监听器来监听并重写某些函数来处理。

      按键按下事件:通过重写onKeyDown方法

      按键重复点击:通过重写onKeyMultiple方法
      按键弹起事件:通过重写onKeyUp方法
      触笔点击事件:通过实现onTouchEvent方法

    -------------------------------------------------------------------------------------------------------------------------

    获取android IP

    参考前人研究成果,非个人创作

    1.使用WIFI

    首先设置用户权限

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

    其次,代码如下

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            //获取wifi服务
            WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            //判断wifi是否开启
            if (!wifiManager.isWifiEnabled()) { 
            wifiManager.setWifiEnabled(true);   
            } 
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();      
            int ipAddress = wifiInfo.getIpAddress();  
            String ip = intToIp(ipAddress);  
            EditText et = (EditText)findViewById(R.id.EditText01);
            et.setText(ip);
        }    
        private String intToIp(int i) {      
            
              return (i & 0xFF ) + "." +      
            ((i >> 8 ) & 0xFF) + "." +      
            ((i >> 16 ) & 0xFF) + "." +      
            ( i >> 24 & 0xFF) ;
         }  

    2.使用GPRS

    首先,设置用户上网权限

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    其次,代码如下

    public String getLocalIpAddress() 
        { 
            try 
            { 
                for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) 
                { 
                   NetworkInterface intf = en.nextElement(); 
                   for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) 
                   { 
                       InetAddress inetAddress = enumIpAddr.nextElement(); 
                       if (!inetAddress.isLoopbackAddress()) 
                       { 
                           return inetAddress.getHostAddress().toString(); 
                       } 
                   } 
               } 
            } 
            catch (SocketException ex) 
            { 
                Log.e("WifiPreference IpAddress", ex.toString()); 
            } 
            return null; 
        }

    ----------------------------------------------------------------------------------

    不知道其他应用的action main情况下启动他

    Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。
    一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动:
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);            
    ComponentName cn = new ComponentName(packageName, className);            
    intent.setComponent(cn);
    startActivity(intent);

    但是更多的时候,我们一般都不知道应用程序的启动Activity的类名,而只知道包名,我们可以通过ResolveInfo类来取得启动Acitivty的类名。

    下面是实现代码:
    private void openApp(String packageName) {
    PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);

    Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
    resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    resolveIntent.setPackage(pi.packageName);

    List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);

    ResolveInfo ri = apps.iterator().next();
    if (ri != null ) {
    String packageName = ri.activityInfo.packageName;
    String className = ri.activityInfo.name;

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);

    ComponentName cn = new ComponentName(packageName, className);

    intent.setComponent(cn);
    startActivity(intent);
    }
    }


    android布局属性详解
      各种Layout用到的一些重要的属性

      第一类:属性值为true或false

      android:layout_centerHrizontal 水平居中

      android:layout_centerVertical 垂直居中

      android:layout_centerInparent 相对于父元素完全居中

      android:layout_alignParentBottom 贴紧父元素的下边缘

      android:layout_alignParentLeft 贴紧父元素的左边缘

      android:layout_alignParentRight 贴紧父元素的右边缘

      android:layout_alignParentTop 贴紧父元素的上边缘

      android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

      第二类:属性值必须为id的引用名“@id/id-name”

      android:layout_below 在某元素的下方

      android:layout_above 在某元素的的上方

      android:layout_toLeftOf 在某元素的左边

      android:layout_toRightOf 在某元素的右边

      android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐

      android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐

      android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐

      android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

      第三类:属性值为具体的像素值,如30dip,40px

      android:layout_marginBottom 离某元素底边缘的距离

      android:layout_marginLeft 离某元素左边缘的距离

      android:layout_marginRight 离某元素右边缘的距离

      android:layout_marginTop 离某元素上边缘的距离

      EditText的android:hint

      设置EditText为空时输入框内的提示信息。

      android:gravity

      android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity=”right”则button上面的文字靠右

      android:layout_gravity

      android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity=”right”则button靠右

      android:layout_alignParentRight

      使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。

      android:scaleType:

      android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:

      CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示

      CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)

      CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽

      FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示

      FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置

      FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置

      FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示

      MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。

    Android的电源管理部分,在纵向上分为四层:

    第一部分:Application

    主要是利用Android Frameworks提供的API进行应用级的开发,需要注意的是相关权限的申明:

    < uses-permission android:name="android.permission.WAKE_LOCK" /> 

    < uses-permission android:name="android.permission.DEVICE_POWER" />

     

    第二部分:Frameworks

    1.       / frameworks/base/core/java/android/os/PowerManager.java

    v  PowerManager:提供对设备的电源进行管理

    ?  常见锁类型

    Flag Value

    CPU

    Screen

    Keyboard

    PARTIAL_WAKE_LOCK

    On

    Off

    Off

    SCREEN_DIM_WAKE_LOCK

    On

    Dim

    Off

    SCREEN_BRIGHT_WAKE_LOCK

    On

    Bright

    Off

    FULL_WAKE_LOCK

    On

    Bright

    Bright

    ?  附加锁类型:仅仅是对Screen有影响

    Flag Value

    Description

    ACQUIRE_CAUSES_WAKEUP

    This flag will force the screen and/or keyboard to turn on immediately.

    ON_AFTER_RELEASE

    If this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer

    v  WakeLock:电源管理对象锁

    v  Usage:

    ?  获取PowerManager实例PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);   

    ?  获取PowerManager.WakeLock实例mWakeLock=pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TEST");

    ?  Device On

    mWakeLock.acquire();

    ?  Device Off

    mWakeLock.release();

    2.       / frameworks/base/core/java/android/os/Power.java

    提供一些电源管理的函数,如reboot()。其是JNI的上层接口,其往下调用android_os_power.cpp

    3.       / frameworks/base/services/java/com/android/server/PowerManagerService.java

    电源管理服务,AIDL接口IPowerManager的实现者。

    第三部分:JNI

    /frameworks/base/core/jni/android_os_power.cpp

    第四部分:Native

    /hardware/libhardware/power/power.c

    Linux kernel交互

    第五部分:Linux驱动层

    /drivers/android/power.c

    第六部分:使用电源管理注意事项

    1.       可在onCreate时设置该界面的电源管理,在onDestroy时取消设置

    2.       可在onResume时设置该界面的电源管理,在onPause时取消设置

    3.       注意设置是以Activity为单位,不是以应用为单位

    4.       注意在AndroidManifest.xml中声明该应用有设置电源管理的权限

    5.       注意加锁解锁要成对出现

    6.       注意多个用途最好用多个锁,不要一锁多用,以免出错

    7.       注意对运行在后台和异常时对锁的处理

    8.       注意在网络连接或传输时最好加锁,以免传输被中断

    http://www.rosoo.net/a/201012/10599.html

    9.       注意加锁以保证程序逻辑

    http://173.234.53.177/?paged=4

    ---------------------------------------------------

     通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!
    AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    //通话音量
          int max = am.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
          int current = am.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
          Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);
    //系统音量
          max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
          current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
          Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);
    //铃声音量
          max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
          current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
          Log.d(”RING”, “max : ” + max + ” current : ” + current);
    //音乐音量
          max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
          current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
          Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);
    //提示声音音量
          max = am.getStreamMaxVolume( AudioManager.STREAM_ALARM );
          current = sm.getStreamVolume( AudioManager.STREAM_ALARM );
          Log.d(”ALARM”, “max : ” + max + ” current : ” + current);
    设置音量的方法也很简单,AudioManager提供了方法:
    public void setStreamVolume(int streamType, int index, int flags)
    其中 streamType 有内置的常量,可以在AudioManager里面查到相关的定义。 通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!
    AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    android中定义的dimension单位有以下这些:
    px(Pixels ,像素):对应屏幕上的实际像素点。
    in(Inches ,英寸):屏幕物理长度单位。
    mm(Millimeters ,毫米):屏幕物理长度单位。
    pt(Points ,磅):屏幕物理长度单位,1/72英寸。
    dp(与密度无关的像素):逻辑长度单位,在 160 dpi 屏幕上,1dp=1px=1/160英寸。随着密度变化,对应的像素数量也变化,但并没有直接的变化比例。
    dip:与dp相同,多用于Google示例中。
    sp(与密度和字体缩放度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。


    android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下:
    1、Drawable → Bitmap
    Java代码

    public static Bitmap drawableToBitmap(Drawable drawable) {

    Bitmap bitmap = Bitmap
    .createBitmap(
    drawable.getIntrinsicWidth(),
    drawable.getIntrinsicHeight(),
    drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
    : Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bitmap);
    //canvas.setBitmap(bitmap);
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    drawable.draw(canvas);
    return bitmap;
    }
    2、从资源中获取Bitmap
    Java代码

    Resources res=getResources();

    Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
    3、Bitmap → byte[]
    Java代码

    private byte[] Bitmap2Bytes(Bitmap bm){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return baos.toByteArray();
    }

    4、 byte[] → Bitmap

    Java代码

    private Bitmap Bytes2Bimap(byte[] b){
    if(b.length!=0){
    return BitmapFactory.decodeByteArray(b, 0, b.length);
    }
    else {
    return null;
    }
    }

    android:theme="@android:style/Theme.Dialog"   将一个Activity显示为对话框模式
    android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏
    android:theme="@android:style/Theme.Light"  背景为白色
    android:theme="@android:style/Theme.Light.NoTitleBar"  白色背景并无标题栏 
    android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"  白色背景,无标题栏,全屏
    android:theme="@android:style/Theme.Black"  背景黑色
    android:theme="@android:style/Theme.Black.NoTitleBar"  黑色背景并无标题栏
    android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"    黑色背景,无标题栏,全屏
    android:theme="@android:style/Theme.Wallpaper"  用系统桌面为应用程序背景
    android:theme="@android:style/Theme.Wallpaper.NoTitleBar"  用系统桌面为应用程序背景,且无标题栏
    android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen"  用系统桌面为应用程序背景,无标题栏,全屏
    android:theme="@android:style/Translucent" 半透明效果
    android:theme="@android:style/Theme.Translucent.NoTitleBar"  半透明并无标题栏
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"  半透明效果,无标题栏,全屏
    android:theme="@android:style/Theme.Panel"
    android:theme="@android:style/Theme.Light.Panel"
  • 相关阅读:
    图形
    附属信息
    文件操作
    字符编码
    Python数据类型之基础记。。。
    python并发编程之多进程
    python并发编程之多进程
    计算机基础之计算机系统的简单了解。
    元类
    基于socketserver模块实现并发tcp/udp
  • 原文地址:https://www.cnblogs.com/sardine/p/2135580.html
Copyright © 2020-2023  润新知