• 自定义属性之LinearLayout ImageView TextView模拟图片文字按钮


    一、资源文件:

    1、文字选择器:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:state_pressed="true" android:color="#FF111111"/>
        <!-- pressed -->
        <item android:state_focused="true" android:color="#FF222222"/>
        <!-- focused -->
        <item android:state_selected="true" android:color="#FF333333"/>
        <!-- selected -->
        <item android:state_active="true" android:color="#FF444444"/>
        <!-- active -->
        <item android:state_checkable="true" android:color="#FF555555"/>
        <!-- checkable -->
        <item android:state_checked="true" android:color="#FF666666"/>
        <!-- checked -->
        <item android:state_enabled="true" android:color="#FF777777"/>
        <!-- enabled -->
        <item android:state_window_focused="true" android:color="#FF888888"/>
        <!-- window_focused -->
    
    </selector>

      2、背景选择器:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >
    
        <stroke
            android:width="0.5dip"
            android:color="#ff9d9d9d" />
    
        <corners android:radius="2dip" >
        </corners>
    
        <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip"/>
        
        <gradient android:startColor="#ff9d9d9d"
            android:centerColor="#ff9e9e9e"
            android:endColor="#ff9d9d9d"
            />
    </shape>
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >
    
        <stroke
            android:width="0.5dip"
            android:color="#ff505050" />
    
        <corners android:radius="2dip" >
        </corners>
    
        <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip"/>
        
        <gradient android:startColor="#ff404040"
            android:centerColor="#ff383838"
            android:endColor="#ff404040"
            />
    </shape>
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@drawable/item_background" android:state_enabled="true" android:state_window_focused="false"/>
        <item android:drawable="@drawable/item_background_selected" android:state_pressed="true"/>
        <item android:drawable="@drawable/item_background" android:state_focused="true"/>
        <item android:drawable="@drawable/item_background"/>
    
    </selector>

    3、属性文件:

     <!-- imageview text -->
        <declare-styleable name="ImageViewText">
            <attr name="image_size" format="dimension" />
            <attr name="image_src" format="reference" />
            <attr name="textSize" format="dimension" />
            <attr name="text" format="string" />
            <attr name="textMargin" format="dimension" />
            <attr name="textColor" format="reference" />
            <!-- 取值  left top right bottom  -->
            <attr name="text_direction" format="string" />
            <attr name="state_normal" format="color" />
            <attr name="state_pressed" format="color" />
            <attr name="state_selected" format="color" />
            <attr name="view_background" format="reference" />
        </declare-styleable>

    二、自定义图片文字:

      1、采用后台代码实现:

    public class ImageViewText extends LinearLayout {
        private ImageView mImageView;
        private TextView mTextView;
    
        private View view;
     
        public ImageViewText(Context context) {
            super(context);
            initView(context, null);
        }
    
        public ImageViewText(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView(context, attrs);
        }
    
        private void initView(Context context, AttributeSet attrs) {
             
            mImageView = new ImageView(context);
            mTextView = new TextView(context);
            view = this;
            view.setBackgroundColor(Color.GRAY);
            this.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
            this.setPadding(5, 5, 5, 5);
    
            view.setClickable(true);
            view.setFocusable(true);
            view.setOnClickListener(ocl);
    //        view.setOnTouchListener(otl);
    
            TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
            float textSize = typedArray.getDimension(R.styleable.ImageViewText_textSize, 14);
            
            Logger.getLogger().e("size: "+typedArray.getDimensionPixelSize(R.styleable.ImageViewText_textSize, 0));
    //      textSize = textSize/3;
            String text = typedArray.getString(R.styleable.ImageViewText_text);
            float textMarginLeft = typedArray.getDimension(R.styleable.ImageViewText_textMargin, 10);
            float image_width = typedArray.getDimension(R.styleable.ImageViewText_image_width, 10);
            float image_height = typedArray.getDimension(R.styleable.ImageViewText_image_height, 10);
    
            
            int textColor = typedArray.getColor(R.styleable.ImageViewText_textColor, Color.TRANSPARENT);
            if(textColor!=Color.TRANSPARENT){
                 mTextView.setTextColor(textColor);
            }else {
                int pressed = typedArray.getColor(R.styleable.ImageViewText_state_pressed, Color.BLACK);
                int normal = typedArray.getColor(R.styleable.ImageViewText_state_normal, Color.BLACK);
                int selected = typedArray.getColor(R.styleable.ImageViewText_state_selected, Color.BLACK);
                mTextView.setTextColor(createColorStateList(normal,pressed,selected));
            }
             
    
            int background = typedArray.getResourceId(R.styleable.ImageViewText_view_background, 0);
            int image_src = typedArray.getResourceId(R.styleable.ImageViewText_image_src, 0);
            if (image_src!=0) {
                mImageView.setBackgroundResource(image_src);
            }
            if (background!=0) {
                view.setBackgroundResource(background);
            }
            
            
            String text_direction = typedArray.getString(R.styleable.ImageViewText_text_direction);
            mTextView.setText(text);
    
            mTextView.setTextSize(textSize);
           
    
            LayoutParams imageLayoutParams = new LayoutParams((int) image_width,
                    (int) image_height);
      
            Logger.getLogger().e("size: "+textSize+" w: "+image_width+" h: "+image_height );
            Logger.getLogger().e("size: "+textSize+" w: "+DensityUtil.dip2px(context, image_width)+" h: "+DensityUtil.dip2px(context, image_height) );
            mImageView.setLayoutParams(imageLayoutParams);
            
    
            typedArray.recycle();//
            
            LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            if (TextDirection.LEFT.equals(text_direction)) {
                this.setOrientation(HORIZONTAL);
                params.rightMargin = (int) textMarginLeft;
                mTextView.setLayoutParams(params);
                addView(mTextView);
                addView(mImageView);
                
            } else if (TextDirection.RIGHT.equals(text_direction)) {
                this.setOrientation(HORIZONTAL);
                params.leftMargin = (int) textMarginLeft;
                mTextView.setLayoutParams(params);
                addView(mImageView);
                addView(mTextView);
            } else if (TextDirection.TOP.equals(text_direction)) {
                this.setOrientation(VERTICAL);
                params.bottomMargin = (int) textMarginLeft;
                mTextView.setLayoutParams(params);
                addView(mTextView);
                addView(mImageView);
            } else if (TextDirection.BOTTOM.equals(text_direction)) {
                this.setOrientation(VERTICAL);
                params.topMargin = (int) textMarginLeft;
                mTextView.setLayoutParams(params);
                addView(mImageView);
                addView(mTextView);
            }
        }
    
        public OnClickListener ocl = new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onClick(v);
                }
            }
        };
    
    
        public OnClickListenerView listener;
    
        public void setOnClickListener(OnClickListenerView listenerView) {
            this.listener = listenerView;
        }
    
        public interface OnClickListenerView {
            public void onClick(View v);
        }
    
        /** 对TextView设置不同状态时其文字颜色。 */
        private ColorStateList createColorStateList(int normal, int pressed,
                int selected) {
            int[] colors = new int[] { pressed,  selected, normal };
            int[][] states = new int[3][];
            states[0] = new int[] { android.R.attr.state_pressed,
                    android.R.attr.state_enabled };
            states[1] = new int[] { android.R.attr.selectable,
                    android.R.attr.state_focused };
            states[2] = new int[] {};
             
            ColorStateList colorList = new ColorStateList(states, colors);
            return colorList;
        }
    
    
    
        public class TextDirection {
            public static final String LEFT = "left";
            public static final String TOP = "top";
            public static final String RIGHT = "right";
            public static final String BOTTOM = "bottom";
        }
    }

      2、采用后台代码和布局文件:

    注意属性duplicateParentState的使用

    <?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:background="@drawable/me_app_selector"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingLeft="15dip" >
    
        <ImageView
            android:id="@+id/iv_button_icon"
            android:layout_width="35dip"
            android:layout_height="35dip"
            android:src="@drawable/me_settings" />
    
        <TextView
            android:id="@+id/tv_button_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:duplicateParentState="true"
            android:text="收藏"
            android:textColor="@color/blue_shallow"
            android:textSize="@dimen/font_body_16" />
    
    </LinearLayout>
    public class ImageViewText extends LinearLayout {
    
        private LayoutInflater inflater;
        private ImageView mImageView;
        private TextView mTextView;
    
        private View view;
    
        public ImageViewText(Context context) {
            super(context);
            initView(context, null);
        }
     
        public ImageViewText(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView(context, attrs);
        }
    
        private void initView(Context context, AttributeSet attrs) {
            inflater = LayoutInflater.from(context);
            view = inflater.inflate(R.layout.widget_imageview_text, null);
    
            mImageView = (ImageView) view.findViewById(R.id.iv_button_icon);
            mTextView = (TextView) view.findViewById(R.id.tv_button_text);
            view.setClickable(true);
            view.setFocusable(true);
            view.setOnClickListener(ocl);
             
            TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
            String text = a.getString(R.styleable.ImageViewText_text);
            int drawable = a.getResourceId(R.styleable.ImageViewText_image_src, 0);
            mTextView.setText(text);    
            mImageView.setImageResource(drawable);
    
            a.recycle(); 
            addView(view, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
    
        }
    
        public OnClickListener ocl = new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener!=null) {
                    listener.onClick(v);
                }
            }
        };
    //
    //    /**
    //     * 设置颜色
    //     */
    //    public OnTouchListener otl = new OnTouchListener() {
    //        @Override
    //        public boolean onTouch(View v, MotionEvent event) {
    //            if (event.getAction() == MotionEvent.ACTION_DOWN) {
    //                view.setBackgroundColor(context.getResources().getColor(
    //                        R.color.blue_shallow));
    //            } else if (event.getAction() == MotionEvent.ACTION_UP) {
    //                view.setBackgroundColor(Color.GRAY);
    //            }
    //            return false;
    //        }
    //    };
    
        public OnClickListenerView listener;
    
        public void setOnClickListener(OnClickListenerView listenerView) {
            this.listener = listenerView;
        }
    
        public interface OnClickListenerView {
            public void onClick(View v);
        }
    }
  • 相关阅读:
    判别模型、生成模型与朴素贝叶斯方法
    git的安装已经连github
    uva 10061 How many zero's and how many digits ?
    Java菜鸟学习笔记()--面向对象篇(七):Wrapper Class包装类
    丁香园技术负责人冯大辉近日在知乎上披露了当年共同创办阿里巴巴的18个合伙人的近况:
    不用派生CTreeCtrl不用繁琐的过程 教你如何让CTreeCtrl的每一项有ToolTip提示
    数据结构排序系列详解之三 冒泡排序
    HDU 4612 (13年多校第二场1002)无向图缩点,有重边
    Mac下cocos2dx3.1用Cocos IDE写的Lua binding篇01
    SECURITY_ATTRIBUTES 设置低权限
  • 原文地址:https://www.cnblogs.com/lbangel/p/3870361.html
Copyright © 2020-2023  润新知