目的:完成一个手势锁的界面布局,对Relative,Contains等布局进行简单的使用,onWindowFocusChanged进行一定的熟练。大概来说,就是增加对界面布局的了解。

技术:(1)简单的RelativeLayout布局

(2)简单的onWindowFocusChanged的使用

(3)内部类Layout的使用

(4)简单视图方法

效果:

效果.jpg

代码:

这是我们的源代码

package ly.pxd.mtext;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);//读取XML的,系统自带不用管

}

@Override

public void onWindowFocusChanged(boolean hasFocus) {

//当Activity的当前Window获得或失去焦点时会被回调此方法。

// 当回调了这个方法时表示Activity是完全对用户可见的,即是真正的界面构建完成了。

// 当对话框弹起/消失及Activity新创建及回退等都会调用此方法。

//相比之下,onResume()方法更多的是指Activity进入了可见的状态,并不是真正的界面构

// 建完成了,因此获得手机界面的高度和宽度用这个方法比较好。

super.onWindowFocusChanged(hasFocus);

if (hasFocus) {//判断是否已经显示

RelativeLayout mtemp1 = findViewById(R.id.fir_iv);

//一个视图链接我们主视图的ID

ImageView mtemp2 = findViewById(R.id.thr_iv);

//得到我们所需操作界面

float mscale = getResources().getDisplayMetrics().density;

//得到我们手机的分辨率

int x = (int) mtemp2.getX();

int y = (int) mtemp2.getY();

//这个界面的坐标

for (int i = 0; i < 2; i++)//竖线

for (int j = 0; j < 3; j++) {

ImageView mtemp3 = new ImageView(this);

mtemp3.setBackgroundResource(R.drawable.normal_highlight2);

RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT

);

temp.leftMargin = (int) (x + 42 * mscale) + (int) (99 * mscale) * j;

temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * i;

mtemp1.addView(mtemp3, temp);

}

for (int i = 0; i < 2; i++)//一个循环,因为我们的这个界面要求6

// 个这种控件

for (int j = 0; j < 3; j++) {

ImageView mtemp3 = new ImageView(this);

//一个新的视图,它的环境在我们的MainActivity

mtemp3.setBackgroundResource(R.drawable.normal_highlight1);

//背景环境资源

RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT

);//一个控件的尺寸,定义时要表示出它的宽高

temp.leftMargin = (int) (x + 42 * mscale) + (int) (99 * mscale) * i;

temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * j;

mtemp1.addView(mtemp3, temp);

}

for (int i = 0; i < 2; i++)//左斜线

for (int j = 0; j < 2; j++) {

ImageView mtemp3 = new ImageView(this);

mtemp3.setBackgroundResource(R.drawable.normal_highlight3);

RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT

);

temp.leftMargin = (int) (x + 42 * mscale) + (int) (99 * mscale) * i;

temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * j;

mtemp1.addView(mtemp3, temp);

}

for (int i = 0; i < 2; i++)//右斜线

for (int j = 0; j < 2; j++) {

ImageView mtemp3 = new ImageView(this);

mtemp3.setBackgroundResource(R.drawable.normal_highlight4);

RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT

);

temp.leftMargin = (int) (x + 50 * mscale) + (int) (99 * mscale) * i;

temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * j;

mtemp1.addView(mtemp3, temp);

}

for (int i = 0; i < 3; i++)//右斜线

for (int j = 0; j < 3; j++) {

ImageView mtemp3 = new ImageView(this);

mtemp3.setBackgroundResource(R.drawable.selected_dot);

RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT

);

temp.leftMargin = (int) (x + 35 * mscale) + (int) (99 * mscale) * i;

temp.topMargin = (int) (y + 165* mscale) + (int) (99 * mscale) * j;

mtemp1.addView(mtemp3, temp);

}

}

}

//这下面是我的一些随笔可看可不看

//view是所有视图的父类,只有最基本的功能

//线性布局默认是横向的

//改容器所有控件都会改变,所以只想改一个控件的话,要单独改这个控件

//background背景颜色

//线性布局的方向:orientation方法(也可能是类)里的

// Vertical纵向

// horizontal横向

//layout 有左右Left Right 与开始结束 Start End的Margin边距,注意开始结束是相对这个控件而言的(对于相邻的控件或者手机边距)

//上边距 Top 下边距 Button

// 外间距 既然View里面都能用

//那......所有布局都有(所有的布局类里面,包括控件)应为所有的布局类都维护一个LayoutParams

//padding是一个控件与自己内容位置的关系 内间距

//权重按比例分配,layout_weight值越小越重要

//线性布局,没有交叉

//相对布局,在Margin_layout的基础上添加了对齐,layout_align(上下左右),两个控件采用一个设置id一个调用方法的方式也是一种方法

//margin_horizontal="大小" 横向对齐的基础上,移动多少

//center_horizontal=中间的基础上横向对齐

//constraint(上下左右)相对大小,设置的默认大小为0不知道不为0时会怎样,应该会失败吧(特有方法)androidx.constraintlayout.widget.ConstraintLayout

//constraintDimensionRatio(h/w,?:?)的用法不是太清楚高宽比或者宽高比,后面的为前面那个高或者宽

//要试一试

//align是什么?

//资源图片的名称,必须a-z,0-9或者下划线

//scaleType里面用fitXY进行拉伸

//R-values-style-noActionbar不要标题栏

//一个Imageview对象下的setbackgroudResource()方法是什么?

//坐标的获取......onWindowFocusChanged

//控件是矩形的

// RelativeLayout mfirst=findViewById(R.id.fir_iv);

//ImageView temp=new ImageView(this);

//创建了一个视图,

//temp.setBackgroundResource(R.drawable.selected_dot);

//设置视图背景资源

//一个控件的尺寸,只是尺寸

//RelativeLayout.LayoutParams templocation=new RelativeLayout.LayoutParams(

// ViewGroup.LayoutParams.WRAP_CONTENT,

// ViewGroup.LayoutParams.WRAP_CONTENT);

//这个类是内部静态类,每个布局都有的,一般

//这个方法怎么用的,我的理解是,每个布局都有其特有的LayoutParams方法,其创建这个对

// 象时需要给予两个参数,大小,一个横一个纵宽高,就是宽高......可能不是,去查查

//getlocalVisibleRect......一些找坐标的方法

//安卓 在容器中添加的控件需要被window计算

//Viewgroup的意义?

//Constraint里面那个对齐方法会调整边框大小

//重写onWindowFocusChanged这个方法,因为它会在所有子控件测量好后调用,不过这个方法好像会调用多次,占内存

//addView(?,?)第一个参数是我们要加入的视图,第二个是以怎样的尺寸去添加这个视图

//get可以上下左右,而且可以得到宽高

//真正的图片要用另一个方法

//不同的屏幕分辨率不一样,显示同一张图片的大小不同

//什么是屏幕的密度?嗯,,,,,分辨率?嗯。

//float fentemp=getResources().getDisplayMetrics().density;

// System.out.println(fentemp);//得到拉伸尺寸

//x,y超出了图片的范围会闪屏,,昨天那个程序的问题

//setVisibility设置隐藏性

//onTouchEvent方法,来实现点亮功能

}

xml文件

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity"

android:id="@+id/fir_iv">

android:id="@+id/sec_iv"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:src="@drawable/main_bg"

android:scaleType="fitXY"/>

android:id="@+id/thr_iv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/op_bg"

android:layout_centerInParent="true"/>

没有要标题栏,在res-values-style里面进行了一些修改

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

这是这里要用到的图片,很简单的一个程序,嗯,不看我随笔的话挺短的,而且那几个循环都是一样的原理,理解一个就行了的:

main_bg.png

normal_highlight1.png

normal_highlight2.png

normal_highlight3.png

normal_highlight4.png

op_bg.png

selected_dot.png

wrong_dot.png

wrong_highlight1.png

wrong_highlight2.png

wrong_highlight3.png

wrong_highlight4.png

感悟:万事开头难吧,在最近的学习中确实有很多的新东西,不过,谁让我决定学了呢。既然做了决定而且自己又有能力去学好,就不应该放弃呀。浮云落霞日悠悠,画池鳞影月空空。伊盼君归心无忧,君归已然青云楼。

android studio按坐标布局,Android studio一个手势锁的界面布局相关推荐

  1. android touch事件坐标原点,Android – 捏缩放ontouch事件坐标

    我正在尝试获取我正在创建的 Android应用程序的画布坐标.它很有用,直到我添加代码以使用缩放焦点(以下两行): scalePoint.setX((int) detector.getFocusX() ...

  2. android 屏幕中心坐标原点,Android 的坐标系及矩阵变换

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android的坐标系 2D坐标系 android的2d坐标系如图所示,水平向右为X轴正方向,竖直向下为Y轴正方向,原点 ...

  3. android touch事件坐标原点,Android onTouch事件与手势操作

    触摸,手势操作已经很好的融入了我们的生活.那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习. 先看效果图 如上 ...

  4. android 模拟gps坐标,1020. Android GPS定位欺骗(模拟定位)的3类途径4种方式

    前段时间发布的手游PokemonGo相信大家都有耳闻,而因为这个游戏在国内的坐标遭到了封锁,很多科学游戏方法也陆续涌现.好不热闹. 那其实,PokemonGo最初的版本,在大陆是可以通过简单的vpn+ ...

  5. android地图获取坐标位置,android 百度地图 根据得到的经纬度 获取位置信息

    满意答案 回复了sfdzyy 2015.07.03 采纳率:57%    等级:7 已帮助:658人 private GeoCoder mSearch = null; // 搜索模块 // 初始化搜索 ...

  6. gridlayout布局单元格宽度设置_安卓界面布局之线性布局

    Android中有六大布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局) .FrameLayout(帧布局),Absol ...

  7. Android常见界面布局

    第2章 Android常见界面布局 第2章 Android常见界面布局 2.1 View视图 2.2 界面布局编写方式 2.2.1 在XML文件中编写布局 2.2.2 在Java代码中编写布局 2.3 ...

  8. Android 常用界面布局

    android-studio-2020.3.1.25-windows安装包 链接:https://pan.baidu.com/s/19SgimjO3OJmkA2mHjfrXvw 提取码:pt0d 实验 ...

  9. android 无网络处理布局,Android网络开发

    1. WebView用法 ①布局文件新建一个WebView,特别注意线性布局和控件的宽高都要匹配父控件 xmlns:tools="http://schemas.android.com/too ...

最新文章

  1. 提升 NLP 实战技能的一点建议
  2. 一个完整的python项目源码-一个Python开源项目-哈勃沙箱源码剖析(下)
  3. 云端飘 String s=new String(abc)创建了几个对象?
  4. ajax文件上传报400,js ajaxfileupload.js上传报错的解决方法
  5. 怎样使用My97日期控件
  6. python初学者用什么编辑器好_新人学 python 选什么编辑器比较好呢??
  7. 科大奥锐实验报告霍尔效应_大学物理实验报告系列之霍尔效应
  8. python吃显卡还是内存条_玩天际线吃U还是吃显卡或者还是吃内存?--天际线配置需求个人见解...
  9. c# mysql 连接
  10. “语音识别”服务人类
  11. 2017-2018-20155336 《信息安全系统设计基础》第六周学习总结
  12. 解决树莓派中文显示框框乱码
  13. 如何写项目方案--从资料准备到书写技巧
  14. java代码餐馆管理系统_java版餐饮管理系统
  15. 养肾=养命!这7个最伤肾的行为你犯了吗?程序员收藏
  16. Android 原生Gallery3d的优化系列--1
  17. JSP内置对象Session——setAttribute/getAttibute/removeAttribute
  18. flutter-Decoration
  19. ALEVEL经济学:通货膨胀的原因是什么?
  20. Streambox Ripper的问题

热门文章

  1. apache 安装与修改端口,修改默认页面,配置虚拟主机
  2. 与传统电商相比,微商城存在哪些优势?
  3. Linux高级应用(十)控制蜂鸣器的应用程序
  4. vba批量合并指定的sheet_Excel VBA 多个工作表合并方法
  5. AD---通过组策略推送软件给客户端
  6. [刷题]leetcode\35_搜索插入位置
  7. 5大系统清道夫帮你整理安卓设备上的臃肿软件
  8. spring-boot-starter-parent作用及测试
  9. SQL Server中的LEFT、RIGHT函数
  10. 中国物料喷射(MJ)市场趋势报告、技术动态创新及市场预测