一、自定义控件

  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的更多相关文章

  1. android自定义控件(四) View中的方法

    onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int ...

  2. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  3. Android自定义控件1--自定义控件介绍

    Android控件基本介绍 Android本身提供了很多控件比如我们常用的有文本控件TextView和EditText:按钮控件Button和ImageButton状态开关按钮ToggleButton ...

  4. View相关知识学习总结

    (一)LayoutInflater原理分析 LayoutInflater主要用于加载布局.通常情况下,加载布局的任务都是在Activity中调用setContentView()方法来完成的,该方法内部 ...

  5. Android View和ViewGroup

    View和ViewGroup Android的UI界面都是由View和ViewGroup及其派生类组合而成的. 其中,View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也 ...

  6. View与ViewGroup有什么区别?

    百度知道:http://zhidao.baidu.com/link?url=B5MFOzDlww8soYqr5CL5FldH4sXD6eumS1XTRn8XEh8gu4mKjQdPkJSLIBt7u_ ...

  7. 手机安全卫士——在设置中心 自定义view和自定义属性

    自定义组合控件 1. 自定义一个View, 继承ViewGroup,比如RelativeLayout,此文中是SettingItemView 2. 编写组合控件的布局文件,在自定义的View中加载   ...

  8. 031 Android 自定义控件

    1.自定义控件的优点 Android自身带的控件不能满足需求, 需要根据自己的需求定义控件. 2.自定义控件的分类: (1)组合已有的控件实现 (2)继承已有的控件实现(扩展已有的功能) (3)完全自 ...

  9. Android 中View的工作原理

    Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...

随机推荐

  1. HttpApplicationState与HttpApplication

    HttpApplicationState 类的单个实例在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建.对于 Web 服务器上的每个 ASP.NET 应用程序 ...

  2. Linux tcpdump命令

    一.简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据 ...

  3. 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 ...

  4. 电商类Web原型制作分享-IKEA

    IKEA是一个家居整合大型零售商,属于电商类官网.电商以展示商品.售后服务.购物流程为主.根据网站的图文方式排版,主导航栏使用的标签组,区域导航栏使用的是垂直选项卡,实现下拉弹出面板交互的功能. 本原 ...

  5. html5移动开发。

    禁止滚动 $('#idl').bind("touchmove",function(e){ e.preventDefault(); }); 图片居中 (因为图片比较特别,所以需要在外 ...

  6. 移动文件流的读写指针---fseek

    函数原型:int fseek(FILE *stream,long offset,int origin) stream:文件指针, offset:偏移量,正数表示正向偏移,负数表示负向偏移.origin ...

  7. C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)

    ( 原书第四章,General Concepts) 只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述. namespace std:新的std子空间包括: std::tr1, ...

  8. Unsorted, maximum ==> sorted

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  9. 2018.09.29 bzoj3039: 玉蟾宫(悬线法)

    传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...

  10. 2018.08.22 NOIP模拟 shop(lower_bound+前缀和预处理)

    Shop 有 n 种物品,第 i 种物品的价格为 vi,每天最多购买 xi 个. 有 m 天,第 i 天你有 wi 的钱,你会不停购买能买得起的最贵的物品.你需要求出你每天会购买多少个物品. [输入格 ...