zoukankan      html  css  js  c++  java
  • 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、视图坐标

  • 相关阅读:
    Linux命令行常用符号
    IP地址详解
    黑帽子白帽子问题
    点香测算时间
    Linux系统中的压缩和打包
    Python冒泡排序
    Python选择排序
    linux 文件三大特殊权限(SUID SGID SBIT)
    预处理器之头文件嵌套包含最大层数
    一不小心就对未分配的内存进行访问和修改
  • 原文地址:https://www.cnblogs.com/whongs/p/7456379.html
Copyright © 2011-2022 走看看