android手机用户界面小实例

1、获取手机屏幕分辨率

final DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
System.out.println("手机分辨率:" + dm.widthPixels + "--" + dm.heightPixels);

2、控件跟随手指移动

首先在xml文件中对页面进行布局,在这里我们放置一个按钮,通过手指的移动来改变按钮的位置

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@+id/activity_02"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context="com.example.whs.sample04.Activity02">
 8 
 9     <Button
10         android:id="@+id/moveBtn"
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:text="测试"
14         />
15 
16 </RelativeLayout>

在Activity中进行具体的实现:

 1 package com.example.whs.sample04;
 2 
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.support.v7.widget.LinearLayoutCompat;
 6 import android.view.MotionEvent;
 7 import android.view.View;
 8 import android.view.ViewGroup;
 9 import android.widget.Button;
10 import android.widget.LinearLayout;
11 import android.widget.RelativeLayout;
12 
13 //实现按钮的界面响应
14 public class Activity02 extends AppCompatActivity {
15 
16     int xSpan;  //在触控笔点击按钮的情况下相对于按钮自己坐标系的值
17     int ySpan;
18     private ViewGroup root;
19 
20     Button btn;
21 
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_02);
26 
27         root = (ViewGroup) findViewById(R.id.activity_02);
28         btn = (Button)findViewById(R.id.moveBtn);
29         btn.setOnTouchListener(new View.OnTouchListener() {
30             @Override
31             public boolean onTouch(View view, MotionEvent motionEvent) {
32                 switch (motionEvent.getAction()){
33                     case MotionEvent.ACTION_DOWN://按下
34                         xSpan = (int)motionEvent.getRawX();
35                         ySpan = (int)motionEvent.getRawY();
36                         break;
37                     case MotionEvent.ACTION_MOVE://移动
38 
39                         //获取手指移动到了哪个点坐标
40                         int xMove = (int)motionEvent.getRawX();
41                         int yMove = (int)motionEvent.getRawY();
42                         //相对于上一个点,手指在x,y方向上分别移动的距离
43                         int dx = xMove - xSpan;
44                         int dy = yMove - ySpan;
45                         //获取Button上一次各个边距离父控件的距离
46                         int left = view.getLeft();
47                         int right = view.getRight();
48                         int bottom = view.getBottom();
49                         int top = view.getTop();
50                         //设置本次Button的上 下 左 右各边与父控件的距离
51                         view.layout(left + dx,top + dy,right + dx,bottom + dy);
52                         // 本次移动的结尾作为下一次移动的开始
53                         xSpan = (int)motionEvent.getRawX();
54                         ySpan = (int)motionEvent.getRawY();
55                         break;
56                     case MotionEvent.ACTION_UP:
57                         break;
58                 }
59                 root.invalidate();
60                 return true;//如果返回true,从手指接触屏幕到手指离开屏幕,将不会触发点击事件。
61             }
62         });
63 
64     }
65 
66 }
View Code

 3、更改手机屏幕显示方向

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@+id/activity_15"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:orientation="vertical"
 8     tools:context="com.example.whs.sample04.Activity15">
 9 
10     <RadioGroup
11         android:id="@+id/RadioGroup01"
12         android:layout_width="match_parent"
13         android:layout_height="wrap_content"
14         android:orientation="horizontal"
15         >
16         <RadioButton
17             android:id="@+id/radioButton01"
18             android:text="竖屏"
19             android:layout_width="wrap_content"
20             android:layout_height="wrap_content" />
21         <RadioButton
22             android:id="@+id/radioButton02"
23             android:text="横屏"
24             android:layout_width="wrap_content"
25             android:layout_height="wrap_content" />
26 
27 
28     </RadioGroup>
29 
30 
31 
32 </LinearLayout>

主要通过android.app.activity.getRequestedOrientation()来感知屏幕的状态,若返回-1则无法识别屏幕状态。用setRequestedOrientation来设置屏幕状态。

 1 package com.example.whs.sample04;
 2 
 3 import android.content.pm.ActivityInfo;
 4 import android.graphics.Color;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.os.Bundle;
 7 import android.widget.RadioButton;
 8 import android.widget.RadioGroup;
 9 import android.widget.Toast;
10 
11 //更改手机屏幕显示方向
12 public class Activity15 extends AppCompatActivity {
13 
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17 
18         setContentView(R.layout.activity_15);
19 
20         RadioGroup rg = (RadioGroup)findViewById(R.id.RadioGroup01);
21         final RadioButton rbH = (RadioButton)findViewById(R.id.radioButton01);
22         final RadioButton rbV = (RadioButton)findViewById(R.id.radioButton02);
23         // 取得当前屏幕方向
24         final int orient = getRequestedOrientation();
25         if (orient == -1){
26             Toast.makeText(this, "无法区分横竖屏!!", Toast.LENGTH_SHORT).show();
27         }
28         System.out.println("屏幕:" + orient);
29         RadioGroup.OnCheckedChangeListener mChange = new RadioGroup.OnCheckedChangeListener() {
30             @Override
31             public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
32                 if (checkedId == rbH.getId()){//横屏按钮
33 
34                     if (orient == -1){
35                         Toast.makeText(Activity15.this, "无法区分横竖屏!!", Toast.LENGTH_SHORT).show();
36                     }else {
37                         if (orient == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){//若为横屏,设置为竖屏
38                             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
39                             Toast.makeText(Activity15.this, "现在是竖屏啦!!", Toast.LENGTH_SHORT).show();
40                         }
41                     }
42 
43                 }else if (checkedId == rbV.getId()){//竖屏按钮
44                     if (orient == -1){
45                         Toast.makeText(Activity15.this, "无法区分横竖屏!!", Toast.LENGTH_SHORT).show();
46                     }else {
47                         if (orient == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){//若为竖屏,设置为横屏
48                             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
49                             Toast.makeText(Activity15.this, "现在是横屏啦!!", Toast.LENGTH_SHORT).show();
50                         }
51                     }
52                 }
53             }
54         };
55         rg.setOnCheckedChangeListener(mChange); //RadioGroup添加监听器
56 
57     }
58 }
View Code

 3、获取手机屏幕信息

 1         DisplayMetrics display = new DisplayMetrics();
 2         //将当前窗口的一些信息放在DisplayMetrics类中,
 3         this.getWindowManager().getDefaultDisplay().getMetrics(display);
 6         float density = display.density;
 7         //输出结果是 dens: density is  1.0
 8         Log.e("dens","density is  "+density);
 9 
10         //获取屏幕像素密度
11         int densityDpi = display.densityDpi;
12         //输出结果是 160
13         Log.e("dens","densityDpi is  "+densityDpi);
14 
15 
16         //获取屏幕的高度 结果单位 px
17         int heightPixels = display.heightPixels;
18         //输出结果是 heightPixels is  480
19         Log.e("dens","heightPixels is  "+heightPixels);
20 
21 
22         //获取屏幕的宽度 结果单位 px
23         int widthPixels = display.widthPixels;
24         //输出结果是 widthPixels is  320
25         Log.e("dens","widthPixels is  "+widthPixels);
26 
27 
28         //获取缩放比例
29         float scaledDensity = display.scaledDensity;
30         //输出结果是 scaledDensity is  1.0
31         Log.e("dens","scaledDensity is  "+scaledDensity);
32 
33         float xdpi = display.xdpi;
34         float ydpi = display.ydpi;
35 
36         //输出结果是 xdpi is  160.0  ydpi 160.0
37         Log.e("dens","xdpi is  "+xdpi+"  ydpi "+ydpi);
38     

 4、动态改变控件的位置和大小

xml文件中的布局如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3         xmlns:android="http://schemas.android.com/apk/res/android"
 4         android:layout_width="match_parent"
 5         android:layout_height="match_parent"
 6         android:orientation="vertical"
 7         android:id="@+id/lls"
 8         >
 9         <TextView
10             android:id="@+id/textView_test"
11             android:layout_width="100dp"
12             android:layout_height="44dp"
13             android:background="#294881"
14             />
15 
16 
17 </LinearLayout>

(1)动态改变TextView的大小和位置

1 TextView textView = (TextView)findViewById(R.id.textView_test);
2         LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) textView.getLayoutParams();
3         Log.e("dens", String.valueOf(params.width));
4         if (params != null){
5             params.width = (int)(120 * scaledDensity);
6             params.height = (int)(40 * scaledDensity);
7         }
8         //设置左边距
9         params.setMargins((int)(20 * scaledDensity), (int)(20 * scaledDensity), 0, 0);

(2)动态添加TextView到布局中

 1         //动态创建控件
 2         LinearLayout mLlPrent = (LinearLayout)findViewById(R.id.lls);
 3         TextView textView1 = new TextView(this);
 4         //设置宽和高
 5         LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams((int)(120 * scaledDensity), (int)(40 * scaledDensity));
 6         //设置外边距
 7         layoutParams.setMargins((int)(20 * scaledDensity), (int)(60 * scaledDensity), 0, 0);
 8         textView1.setPadding((int)(20 * scaledDensity), 0, 0, 0);
 9         textView1.setText("执行");
10         textView1.setLayoutParams(layoutParams);
11         textView1.setBackgroundColor(Color.GRAY);
12         //添加到布局文件中
13         mLlPrent.addView(textView1);

 4、视图坐标

posted @ 2017-08-31 08:06  hongsheng  阅读(467)  评论(0编辑  收藏  举报