zoukankan      html  css  js  c++  java
  • 自定义控件和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("我可以改变");

    }
    }

         

      

      

        

      

      

      

  • 相关阅读:
    springMVC:HandlerInterceptor拦截器的使用
    SpringMVC:JSON形式输出(基于Fastjson)
    Callable接口解析
    FastJson一些常见方法(API):处理JSON变得好简单
    Spring@Autowired注解
    一些错误和解决办法--01
    线程池的原理及实现
    Rotate Image(二位数组顺时针旋转)
    JAVA内部类
    jdk9模块化--特性
  • 原文地址:https://www.cnblogs.com/liunx1109/p/9850142.html
Copyright © 2011-2022 走看看