2015-10-27 16:51:15 rrrraa 阅读数 454
  • Android底层技术:Linux驱动框架与开发

    于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式和框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与Linux两层的驱动开发,规划出整体和谐Android-based软硬整合产品架构。

    22353 人正在学习 去看看 高煥堂

整体思路

定义一个layout,重写onMeasure。定义一个变量,记录两次方法的差值。通过这个差值来判断是否弹出输入框。当然,这是取巧。

1、定义一个布局

package com.example.testandroid.view;

import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.widget.FrameLayout;


/**
 * Created by Administrator on 13-6-27.
 *
 * @author ll
 * @version 2.0.0
 */
public class MonitorSizeEventFrameLayout extends FrameLayout {

    private int mPreviousHeight;

    /**
     * MonitorSizeEventFrameLayout
     *
     * @param context context
     * @param attrs   attrs
     */
    public MonitorSizeEventFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measureHeight = MeasureSpec.getSize(heightMeasureSpec);
        if (mPreviousHeight != 0) {
            int navigationBarHeight = getNavigationBarHeight();
            if (measureHeight < mPreviousHeight - navigationBarHeight) {    // 减去底部虚拟键盘高度,过滤掉虚拟键盘显隐产生的页面高度变化
                System.out.println("打开了");
            } else if (measureHeight - navigationBarHeight > mPreviousHeight) {     
                System.out.println("关闭了");
            }
        }
        mPreviousHeight = measureHeight;
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 获取底部虚拟键Navigation Bar的高度
     * @return
     */
    private int getNavigationBarHeight() {
        Resources resources = getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android");
        int height = resources.getDimensionPixelSize(resourceId);
        return height;
    }
}

2、在Actiivty的布局文件中添加自定义布局

3、在manifest添加

android:windowSoftInputMode="stateHidden|adjustResize"
2016-08-23 09:07:41 qq_22911297 阅读数 3093
  • Android底层技术:Linux驱动框架与开发

    于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式和框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与Linux两层的驱动开发,规划出整体和谐Android-based软硬整合产品架构。

    22353 人正在学习 去看看 高煥堂

这是一个 Android 登录账户 密码 输入框  ,



项目 地址 点击打开链接

效果 图:




采用 自定义 控件 形式

以下是 自定义控件 的 布局

<?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="wrap_content"
              android:layout_margin="10dp"
              android:background="@drawable/background_edittext"
              android:orientation="horizontal">

    <ImageView
        android:id="@+id/drawbleIconView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@mipmap/username"/>

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_weight="1"
        android:background="@null"
        android:singleLine="true"/>

    <ImageView
        android:id="@+id/drawbleDeleteView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginRight="5dp"
        android:src="@mipmap/delete"/>

    <ImageView
        android:id="@+id/drawbleVisableView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@mipmap/username"/>
</LinearLayout>


然后 在 attr.xml 中 定义 要用到 的 控件 属性

    <!-- 自定义 控件 的 属性 -->
    <declare-styleable name="LoginEditTextStyle">
        <!-- 删除 按钮 图标 -->
        <attr name="deleteDrawable" format="reference"/>
        <!-- 隐藏 按钮 图标 -->
        <attr name="visibleDrawable" format="reference"/>
        <!-- 输入框 左边 显示 的 图标-->
        <attr name="iconDrawable" format="reference"/>
        <!-- 是否 是 密码 输入 框 -->
        <attr name="passwordTag" format="boolean"/>
    </declare-styleable>

然后 编写 Java 代码

/**
 * 自定义 登录 输入 框
 * Created by Administrator on 2016/7/12.
 */
public class LoginEditText extends RelativeLayout implements View.OnClickListener, TextWatcher, View.OnFocusChangeListener {
    private Context context;
    private EditText editText;
    private ImageView drawbleIconView, drawbleDeleteView, drawbleVisableView;
    // 是否 是 密码 输入 框
    private boolean passwordTag;
    // 是否 显示 密码
    private boolean passwordDisplayTag;

    public LoginEditText(Context context) {
        this(context, null);
    }

    public LoginEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init();
        getArrrs(attrs);
    }


    private void init() {
        View viewGroup = LayoutInflater.from(context).inflate(R.layout.view_login_edittext, this);
        editText = (EditText) viewGroup.findViewById(R.id.editText);
        drawbleIconView = (ImageView) viewGroup.findViewById(R.id.drawbleIconView);
        drawbleDeleteView = (ImageView) viewGroup.findViewById(R.id.drawbleDeleteView);
        drawbleVisableView = (ImageView) viewGroup.findViewById(R.id.drawbleVisableView);
        setListener();
    }

    private void setListener() {
        drawbleDeleteView.setOnClickListener(this);
        drawbleVisableView.setOnClickListener(this);
        editText.addTextChangedListener(this);
        editText.setOnFocusChangeListener(this);
    }

    private void getArrrs(AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LoginEditTextStyle);

        passwordTag = typedArray.getBoolean(R.styleable.LoginEditTextStyle_passwordTag, false);

        Drawable deleteDrawable = typedArray.getDrawable(R.styleable.LoginEditTextStyle_deleteDrawable);
        Drawable iconDrawable = typedArray.getDrawable(R.styleable.LoginEditTextStyle_iconDrawable);
        Drawable visibleDrawable = typedArray.getDrawable(R.styleable.LoginEditTextStyle_visibleDrawable);

        showOrHideDrawableView(drawbleDeleteView, deleteDrawable);
        showOrHideDrawableView(drawbleIconView, iconDrawable);


        setIsPassword(passwordTag, visibleDrawable);
        // 先默认 隐藏
        drawbleVisableView.setVisibility(GONE);
        drawbleDeleteView.setVisibility(GONE);
    }

    public void setIsPassword(boolean passwordTag, Drawable visibleDrawable) {
        if (passwordTag) {
            editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
            showOrHideDrawableView(drawbleVisableView, visibleDrawable);
        } else {
            showOrHideDrawableView(drawbleVisableView, null);
        }
    }

    public void setIconView(Drawable drawable) {
        showOrHideDrawableView(drawbleIconView, drawable);
    }


    /**
     * 显示 或 隐藏 图标
     *
     * @param imageView
     * @param drawable
     */
    public void showOrHideDrawableView(ImageView imageView, Drawable drawable) {
        if (drawable == null) {
            imageView.setVisibility(GONE);
        } else {
            imageView.setVisibility(VISIBLE);
            imageView.setImageDrawable(drawable);
        }
    }

    public Editable getEditText() {
        return editText.getText();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.drawbleDeleteView:
                editText.setText("");
                break;
            case R.id.drawbleVisableView:
                if (!passwordDisplayTag) {
                    // 设置 EditText 的 input type  显示 密码
                    editText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                } else {
                    // 隐藏 密码
                    editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }
                passwordDisplayTag = !passwordDisplayTag;
                break;
        }

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (hasFocus()) {
            // 当 输入 字符 长度 不为0 时 显示 删除 按钮
            if (s.length() > 0) {
                drawbleDeleteView.setVisibility(VISIBLE);
                if (passwordTag)
                    drawbleVisableView.setVisibility(VISIBLE);
            } else {
                drawbleDeleteView.setVisibility(GONE);
                drawbleVisableView.setVisibility(GONE);
            }
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // 如果 EditText的 焦点 改变了  则相应的 隐藏 显示 功能 按钮
        if (!hasFocus) {
            drawbleDeleteView.setVisibility(GONE);
            drawbleVisableView.setVisibility(GONE);
        } else if (editText.getText().length() > 0) {
            drawbleDeleteView.setVisibility(VISIBLE);
            if (passwordTag)
                drawbleVisableView.setVisibility(VISIBLE);
        }
    }
}
</pre><pre name="code" class="html">


项目 地址 点击打开链接

效果 图:



2017-05-02 19:43:41 owenchan1987 阅读数 1142
  • Android底层技术:Linux驱动框架与开发

    于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式和框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与Linux两层的驱动开发,规划出整体和谐Android-based软硬整合产品架构。

    22353 人正在学习 去看看 高煥堂

仿照拉钩网的登录做的登录界面,如图

这里写图片描述

github 地址:https://github.com/chenzongwen/login

2015-02-04 14:45:46 xz475399320 阅读数 443
  • Android底层技术:Linux驱动框架与开发

    于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式和框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与Linux两层的驱动开发,规划出整体和谐Android-based软硬整合产品架构。

    22353 人正在学习 去看看 高煥堂
可在该布局文件里添加滚屏 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

</ScrollView>
2018-07-03 15:17:09 u014611408 阅读数 422
  • Android底层技术:Linux驱动框架与开发

    于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式和框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与Linux两层的驱动开发,规划出整体和谐Android-based软硬整合产品架构。

    22353 人正在学习 去看看 高煥堂
public class InputCustomDialog extends Dialog {
    public InputCustomDialog(Context context, int theme) {
        super(context, theme);
    }

    public InputCustomDialog(Context context) {
        super(context);
    }

    /**
     * Helper class for creating a custom dialog
     */
    public static class Builder {

        private Context context;
        private String title;
        private String message;
        private View contentView;
        private int inputType;
        private EditText editDialogMessage;
        private DialogInterface.OnClickListener positiveButtonClickListener;
        private DialogInterface.OnClickListener negativeButtonClickListener;

        public Builder(Context context) {
            this.context = context;
        }

        /**
         * Set the Dialog message from String
         *
         * @param
         * @return
         */
        public Builder setMessage(String message) {
            this.message = message;
            return this;
        }

        /**
         * Set the Dialog message from resource
         *
         * @param
         * @return
         */
        public Builder setMessage(int message) {
            this.message = (String) context.getText(message);
            return this;
        }

        public String getMessage(){
            return message;
        }

        /**
         * Set the Dialog title from resource
         *
         * @param
         * @return
         */
        public Builder setTitle(int title) {
            this.title = (String) context.getText(title);
            return this;
        }

        /**
         * Set the Dialog title from String
         *
         * @param
         * @return
         */
        public Builder setTitle(String title) {
            this.title = title;
            return this;
        }

        /**
         * Set a custom content view for the Dialog. If a message is set, the
         * contentView is not added to the Dialog...
         *
         * @param v
         * @return
         */
        public Builder setContentView(View v) {
            this.contentView = v;
            return this;
        }

        public String getEditDialogMessage(){
            return editDialogMessage.getText().toString().trim();
        }

        public Builder setInputType(int type){
            this.inputType  = type;
            return this;
        }

        /**
         * Set the positive button text and it's listener
         *
         * @param listener
         * @return
         */
        public Builder setPositiveButton( DialogInterface.OnClickListener listener) {
            this.positiveButtonClickListener = listener;
            return this;
        }

        /**
         * Set the negative button text and it's listener
         *
         * @param listener
         * @return
         */
        public Builder setNegativeButton(DialogInterface.OnClickListener listener) {
            this.negativeButtonClickListener = listener;
            return this;
        }

        /**
         * Create the custom dialog
         */
        public InputCustomDialog create() {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            // instantiate the dialog with the custom Theme
            final InputCustomDialog dialog = new InputCustomDialog(context, R.style.Dialog);
            dialog.setCanceledOnTouchOutside(false);

            View layout = inflater.inflate(R.layout.layout_input_custom_dialog, null);
            dialog.addContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            // set the dialog title
            if (title != null) {
                ((TextView) layout.findViewById(R.id.edit_dialog_title)).setText(title);
            }
            editDialogMessage = (EditText)layout.findViewById(R.id.edit_dialog_message);
            editDialogMessage.setInputType(inputType);
            // set the confirm button
            if (positiveButtonClickListener != null) {
                ((Button) layout.findViewById(R.id.edit_dialog_positive_button))
                        .setOnClickListener(new View.OnClickListener() {
                            public void onClick(View v) {
                                positiveButtonClickListener.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
                            }
                        });
            }
            // set the cancel button
            if (negativeButtonClickListener != null) {
                ((ImageView) layout.findViewById(R.id.edit_dialog_negative_button))
                        .setOnClickListener(new View.OnClickListener() {
                            public void onClick(View v) {
                                negativeButtonClickListener.onClick(dialog, DialogInterface.BUTTON_NEGATIVE);
                            }
                        });
            }
            dialog.setContentView(layout);
            return dialog;
        }

    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="345dp"
    android:layout_height="200dp"
    android:background="@drawable/dialog_background"
    android:orientation="vertical" >
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/edit_dialog_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#666666"
            android:textSize="25sp"
            android:layout_centerInParent="true" />
        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/cancel"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:padding="7dp"
            android:id="@+id/edit_dialog_negative_button"/>
    </RelativeLayout>

    <EditText
        android:layout_width="295dp"
        android:layout_height="45dp"
        android:textSize="20sp"
        android:textColor="#666666"
        android:id="@+id/edit_dialog_message"
        android:background="@drawable/custom_edit_view"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"/>
    <Button
        android:layout_width="187dp"
        android:layout_height="73dp"
        android:background="@drawable/confirm"
        android:id="@+id/edit_dialog_positive_button"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"/>

</LinearLayout>


没有更多推荐了,返回首页