android的日积月累-显示&窗口
获取显示屏幕信息
Display display = getWindowManager().getDefaultDisplay();
Resource.nDisplayWidth = display.getWidth();
Resource.nDisplayHeight = display.getHeight();
从系统属性中获取现在BUILD的信息
Information about the current build, extracted from system properties.
有BOARD,BOOTLOADER,CPU什么的
为程序添加快捷方式
void addShortcut(){
Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
//快捷方式的名称
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
shortcut.putExtra("duplicate", false); //不允许重复创建
//指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer
//注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序
ComponentName comp = new ComponentName(this.getPackageName(), "."+this.getLocalClassName());
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));
//快捷方式的图标
this.getSystemService(ALARM_SERVICE);
ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.wonhot);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
sendBroadcast(shortcut);
}
判断有无SDCARD及获取SDCARD路径:
sdCardPath = Environment.getExternalStorageDirectory() + "/";
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
return bRet;
调用VIDEOPLAYER
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse(aPath);
intent.setDataAndType(uri, "video/*");
startActivityForResult(intent, PICK_PLAYER);
让程序在状态栏上显示其状态
放在onStop()
private void showNotification(Context context) {
// 创建一个NotificationManager的引用
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
// 定义Notification的各种属性
Notification notification =new Notification(R.drawable.icon,
"测试播放器", System.currentTimeMillis());
notification.flags |= Notification.FLAG_ONGOING_EVENT; // 将此通知放到通知栏的"Ongoing"即"正在运行"组中
notification.flags |= Notification.FLAG_NO_CLEAR; // 表明在点击了通知栏中的"清除通知"后,此通知不清除,经常与FLAG_ONGOING_EVENT一起使用
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
notification.defaults = Notification.DEFAULT_LIGHTS;
//notification.ledARGB = Color.BLUE;
notification.ledOnMS =5000;
// 设置通知的事件消息
CharSequence contentTitle ="测试播放器……"; // 通知栏标题
CharSequence contentText ="ameyume"; // 通知栏内容
Intent notificationIntent =new Intent(context, Test.class); // 点击该通知后要跳转的Activity
PendingIntent contentItent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText,
contentItent);
// 把Notification传递给NotificationManager
notificationManager.notify(0, notification);
}
删除掉状态栏的显示
private void removeNotification(){
NotificationManager notificationManager = (NotificationManager) this
.getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(0);
}
SP,DP等转换
int sp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
15, getResources().getDisplayMetrics());
Android~~获取view在屏幕中的位置
getLocalVisibleRect, 返回一个填充的Rect对象, 感觉是这个View的Rect大小,left,top取到的都是0···
getGlobalVisibleRect, 获取全局坐标系的一个视图区域, 返回一个填充的Rect对象;该Rect是基于总整个屏幕的
···
getLocationOnScreen,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
···
getLocationInWindow,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标 (不是很理解= =、)
···
getLeft,getTop,getBottom,getRight, 这一组是获取相对在它父亲里的坐标
···
**注**:如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些(个人感觉好像是得有焦点,不是很清楚,待查查)
example:
int[] location = new int[2];
v.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
XML:
<?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"
android:padding="5px"
>
<ViewFlipper
android:id="@+id/fliper"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:background="#FFFFFF"
android:flipInterval="2000" >
<TextView
android:id="@+id/tv_1"
android:text="Hello1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
</TextView>
<TextView
android:id="@+id/tv_2"
android:text="Hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
</TextView>
</ViewFlipper>
<Button android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="B"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
JavaCode:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ViewFlipper;
public class ViewLocationActivity extends Activity {
private ViewFlipper flipper;
private Rect mRectSrc = new Rect();
int[] location = new int[2];
int x, y;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
flipper = (ViewFlipper) findViewById(R.id.fliper);
Log.d("demo", "left:" + flipper.getLeft());
Log.d("demo", "right:" + flipper.getRight());
Log.d("demo", "Top:" + flipper.getTop());
Log.d("demo", "Bottom:" + flipper.getBottom());
Button btn = (Button) findViewById(R.id.button2);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.d("demo", "Button.Width--->" + v.getWidth());
Log.d("demo", "Button.Height--->" + v.getHeight());
v.getLocalVisibleRect(mRectSrc);
Log.d("demo", "LocalVisibleRect--->" + mRectSrc);
v.getGlobalVisibleRect(mRectSrc);
Log.d("demo", "GlobalVisibleRect--->" + mRectSrc);
v.getLocationOnScreen(location);
x = location[0];
y = location[1];
Log.d("demo", "Screenx--->" + x + " " + "Screeny--->" + y);
v.getLocationInWindow(location);
x = location[0];
y = location[1];
Log.d("demo", "Window--->" + x + " " + "Window--->" + y);
Log.d("demo", "left:" + v.getLeft());
Log.d("demo", "right:" + v.getRight());
Log.d("demo", "Top:" + v.getTop());
Log.d("demo", "Bottom:" + v.getBottom());
}
});
}
}
**显示**
Button.Width--->470
Button.Height--->72
LocalVisibleRect--->Rect(0, 0 - 470, 72)
GlobalVisibleRect--->Rect(5, 231 - 475, 303)
Screenx--->5 Screeny--->231
Windowx--->5 Windowy--->231
left:5
right:475
Top:155
Bottom:227
获取状态栏高度
decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。
于是,我们就可以算出状态栏的高度了。
Java代码
- Rectframe=newRect();
- getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
- intstatusBarHeight=frame.top;
获取标题栏高度:
getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。
- intcontentTop=getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
- //statusBarHeight是上面所求的状态栏的高度
- inttitleBarHeight=contentTop-statusBarHeight
关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
首先是几个基本概念:
1.屏幕尺寸Screen size
即显示屏幕的实际大小,按照屏幕的对角线进行测量。
为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).
应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。
2.屏幕长宽比Aspect ratio
长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。
3.屏幕分辨率Resolution
在屏幕上显示的物理像素总和。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。
在Andorid系统中,应用程序不直接使用分辨率。
4.密度Density
根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。
在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。
屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。
为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).
应用程序可以为这四种尺寸分别提供不同的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。
5.设备独立像素Density-independent pixel (dp)
应用程序可以用来定义UI组件的虚拟像素单元,通过密度无关的方式来描述布局尺寸和位置。
一个设备独立像素相当于一个160 dpi屏幕上的物理像素。
在程序运行时,系统根据屏幕的实际密度透明的处理任何需要缩放的设备独立像素单元,设备独立像素转换成屏幕实际像素的换算很简单:pixels = dps * (density / 160).
例如在240 dpi的屏幕上,1个设备独立像素等于1.5物理像素.为确保UI组件在不同的屏幕都能合适的展示,强烈建议使用设备独立像素单元来定义你的应用程序UI。
四种屏幕尺寸分类:: small, normal, large, and xlarge
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
需要注意的是: xhdpi是从Android2.2 (API Level 8)才开始增加的分类.
xlarge是从Android 2.3 (API Level 9)才开始增加的分类.
DPI是“dot per inch”的缩写,每英寸像素数。
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
参考:http://developer.android.com/images/screens_support/screens-ranges.png
两种获取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
//这里得到的像素值是设备独立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。
不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。
如果需要为Android pad定制资源文件,则res目录下的目录可能为:
drawable
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-nodpi
drawable-nodpi-1024×600
drawable-nodpi-1280×800
drawable-nodpi-800×480
values
values-ldpi
values-mdpi
values-hdpi
values-xhdpi
values-nodpi
values-nodpi-1024×600
values-nodpi-1280×800
values-nodpi-800×48
实现两个 Activity 切换时的动画。在Activity中使用
有两个参数:进入动画和出去的动画。
注意
1、必须在 StartActivity()或 finish() 之后立即调用。
2、而且在 2.1 以上版本有效
3、手机设置-显示-动画,要开启状态
//实现淡入浅出的效果
startActivity(new Intent(MainActivity.this,SecondActivity.class));
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
// 由左向右滑入的效果
startActivity(new Intent(MainActivity.this,SecondActivity.class));
overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
// 实现zoommin 和 zoomout (自定义的动画)
startActivity(new Intent(OverridePendingTransitionActivity.this,SecondActivity.class));
overridePendingTransition(R.anim.zoomin, R.anim.zoomout);
更多相关文章
- android多屏幕适配相关知识和官方翻译文档
- Android通知NotificationCompat
- Android 四种获取屏幕宽度的方法总结
- 关于Android屏幕密度与分辨率
- Android 根据屏幕大小设置字体
- Android 通知详解
- 自定义Toast,兼容那些安装时把通知关掉还问为啥不给提示的测试人
- android获取屏幕长宽,status bar高度,设置全屏显示
- Android 获得屏幕宽高的三种方式