自定义控件和View
一、自定义控件
MotionEvent.ACTION_UP:抬起
MotionEvent.ACTION_DOWN: 按下
MotionEvent.ACTION_POINTER_UP:
MotionEvent.ACTION_POINTER_DOWN:
先产生一个ACTION_DOWN事件,代表用户的第一个手指接触到了屏幕。
再产生一个ACTION_POINTER_DOWN事件,代表用户的第二个手指接触到了屏幕。
案例:
public class MyButton extends android.support.v7.widget.AppCompatButton {
//三个构造方法
public MyButton(Context context) {
super(context);
}
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//重写onTouchEvent触碰时间的方法
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
setScaleX(0.5f);
setScaleY(0.5f);
break;
case MotionEvent.ACTION_UP:
setScaleX(1.0f);
setScaleY(1.0f);
break;
case MotionEvent.ACTION_POINTER_UP:
// setScaleX(1.0f);
// setScaleY(1.0f);
// break;
case MotionEvent.ACTION_POINTER_DOWN:
//
// break;
}
return super.onTouchEvent(event);
}
}
二、自定义控件在布局(Linearlayout)
1.定义好布局文件来供布局(LinearLayout、FrameLayout)来继承解析
2.继承布局(LinearLayout、FrameLayout)来解析xml文件,里面可以写一下它的构造方法
3.在主布局xml文件中去加载写好的布局,像和加载控件一样去加载
4.在MainActivity中findViewById来绑定布局
1.定义好布局文件来供Fragment来解析 (被引用时候不需要ID)
R.layout.mylogin.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="账号" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:inputType="textPassword" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="密码" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:inputType="textPassword" />
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
android:id="@+id/buttonLoin"
/>
</LinearLayout>
2.2.继承布局(LinearLayout、FrameLayout)来解析xml文件,里面可以写一下它的构造方法
public class MyLogin extends LinearLayout {
private Button buttonLogin;
private EditText editPassword, editLogin;
public MyLogin(Context context) {
super(context);
init(context);
Log.i("MyLogin", "MyLogin1: ");
}
public MyLogin(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
Log.i("MyLogin", "MyLogin2: ");
}
public MyLogin(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
Log.i("MyLogin", "MyLogin3: ");
}
public MyLogin(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
public void init(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.mylogin, MyLogin.this, true);
buttonLogin = view.findViewById(R.id.buttonLoin);
editLogin = view.findViewById(R.id.editText);
editPassword = view.findViewById(R.id.editText1);
}
//重写点击时间的方法
public void setOnClickListener(View.OnClickListener listener) {
buttonLogin.setOnClickListener(listener);
}
}
3.在主布局xml文件中去加载写好的布局,像和加载控件一样去加载(引用时候需要ID)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.example.mi.custombutton.MyLogin --------------------------->这里可以通过找到findViewById找到对应的View------------>linearLayout = findViewById(R.id.login);
button = linearLayout.findViewById(R.id.buttonLoin); //因为linearLayout是View的视图,所以可以在一次来findViewById来找到其他的控件
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
4.在MainActivity中findViewById来绑定布局
public class MainActivity extends AppCompatActivity {
private LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = findViewById(R.id.login);
//button = linearLayout.findViewById(R.id.buttonLoin); //因为linearLayout是View的视图,所以可以在一次来findViewById来找到其他的控件
有了这一步,就不需要再重写这个控件的方法了
//已经重写点击事件的代码
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this , "你成功了" , Toast.LENGTH_SHORT).show();
}
});
}
}
三、自定义布局文件(FrameLayout)
1.定义好FrameLayout的布局 //这里不需要定义布局文件的ID,只是为了给下面的地方作为引用
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/text_exercise"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="我再写测试代码"
android:gravity="center"
android:textColor="#11f"
/>
</FrameLayout>
2.自定义布局文件
public class MyFrame extends FrameLayout {
private ImageView imageView;
private TextView textView;
public MyFrame (Context context) {
super(context);
init(context);
}
public MyFrame(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MyFrame(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public MyFrame(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
public void init(Context context){
View view = LayoutInflater.from(context).inflate(R.layout.myframe, MyFrame.this, true);
imageView = findViewById(R.id.icon);
textView = findViewById(R.id.text_exercise);
}
public void setImageResource(int resource){
imageView.setImageResource(resource);
}
public void setText(String string){
textView.setText(string);
}
}
3.加载自定义布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
android:orientation="vertical"
tools:context=".MainActivity"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> <com.example.mi.custombutton.MyFrame
android:id="@+id/myFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" /> //这里一定定义ID,为了后面便于查找
</LinearLayout> 4.代码加载并且编写
public class MainActivity extends AppCompatActivity {
private MyFrame frameLayout;
private LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = findViewById(R.id.login);
frameLayout = findViewById(R.id.myFrame);
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this , "你成功了" , Toast.LENGTH_SHORT).show();
}
});
//通过对两个函数重写的方式来调用它的子控件
frameLayout.setImageResource(R.drawable.ic_launcher_foreground);
frameLayout.setText("我可以改变"); }
}
自定义控件和View的更多相关文章
- android自定义控件(四) View中的方法
onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int ...
- Android 自定义View合集
自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...
- Android自定义控件1--自定义控件介绍
Android控件基本介绍 Android本身提供了很多控件比如我们常用的有文本控件TextView和EditText:按钮控件Button和ImageButton状态开关按钮ToggleButton ...
- View相关知识学习总结
(一)LayoutInflater原理分析 LayoutInflater主要用于加载布局.通常情况下,加载布局的任务都是在Activity中调用setContentView()方法来完成的,该方法内部 ...
- Android View和ViewGroup
View和ViewGroup Android的UI界面都是由View和ViewGroup及其派生类组合而成的. 其中,View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也 ...
- View与ViewGroup有什么区别?
百度知道:http://zhidao.baidu.com/link?url=B5MFOzDlww8soYqr5CL5FldH4sXD6eumS1XTRn8XEh8gu4mKjQdPkJSLIBt7u_ ...
- 手机安全卫士——在设置中心 自定义view和自定义属性
自定义组合控件 1. 自定义一个View, 继承ViewGroup,比如RelativeLayout,此文中是SettingItemView 2. 编写组合控件的布局文件,在自定义的View中加载 ...
- 031 Android 自定义控件
1.自定义控件的优点 Android自身带的控件不能满足需求, 需要根据自己的需求定义控件. 2.自定义控件的分类: (1)组合已有的控件实现 (2)继承已有的控件实现(扩展已有的功能) (3)完全自 ...
- Android 中View的工作原理
Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...
随机推荐
- HttpApplicationState与HttpApplication
HttpApplicationState 类的单个实例在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建.对于 Web 服务器上的每个 ASP.NET 应用程序 ...
- Linux tcpdump命令
一.简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据 ...
- How to Set Up an Rsync Daemon on Your Linux Server
Introduction This tutorial will take you through setting up an rsync daemon on your Linux server. Yo ...
- 电商类Web原型制作分享-IKEA
IKEA是一个家居整合大型零售商,属于电商类官网.电商以展示商品.售后服务.购物流程为主.根据网站的图文方式排版,主导航栏使用的标签组,区域导航栏使用的是垂直选项卡,实现下拉弹出面板交互的功能. 本原 ...
- html5移动开发。
禁止滚动 $('#idl').bind("touchmove",function(e){ e.preventDefault(); }); 图片居中 (因为图片比较特别,所以需要在外 ...
- 移动文件流的读写指针---fseek
函数原型:int fseek(FILE *stream,long offset,int origin) stream:文件指针, offset:偏移量,正数表示正向偏移,负数表示负向偏移.origin ...
- C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)
( 原书第四章,General Concepts) 只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述. namespace std:新的std子空间包括: std::tr1, ...
- Unsorted, maximum ==> sorted
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 2018.09.29 bzoj3039: 玉蟾宫(悬线法)
传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...
- 2018.08.22 NOIP模拟 shop(lower_bound+前缀和预处理)
Shop 有 n 种物品,第 i 种物品的价格为 vi,每天最多购买 xi 个. 有 m 天,第 i 天你有 wi 的钱,你会不停购买能买得起的最贵的物品.你需要求出你每天会购买多少个物品. [输入格 ...