700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android自定义View以及自定义属性中format详解

Android自定义View以及自定义属性中format详解

时间:2021-03-28 14:45:56

相关推荐

Android自定义View以及自定义属性中format详解

来源整理:/tiantianbyconan/archive//06/06/2538528.html

Android自定义属性,format详解

reference:参考某一资源ID。

(1)属性定义:

<declare-styleable name = "名称"><attr name = "background" format = "reference" /></declare-styleable>

(2)属性使用:

<ImageViewandroid:layout_width = "42dip"android:layout_height = "42dip"android:background = "@drawable/图片ID"/>

color:颜色值。

(1)属性定义:

<declare-styleable name = "名称"><attr name = "textColor" format = "color" /></declare-styleable>

(2)属性使用:

<TextViewandroid:layout_width = "42dip"android:layout_height = "42dip"android:textColor = "#00FF00"/>

boolean:布尔值。

(1)属性定义:

<declare-styleable name = "名称"><attr name = "focusable" format = "boolean" /></declare-styleable>

(2)属性使用:

<Buttonandroid:layout_width = "42dip"android:layout_height = "42dip"android:focusable = "true"/>

dimension:尺寸值。

(1)属性定义:

<declare-styleable name = "名称"><attr name = "layout_width" format = "dimension" /></declare-styleable>

(2)属性使用:

<Buttonandroid:layout_width = "42dip"android:layout_height = "42dip"/>

float:浮点值。

(1)属性定义:

<declare-styleable name = "AlphaAnimation"><attr name = "fromAlpha" format = "float" /><attr name = "toAlpha" format = "float" /></declare-styleable>

(2)属性使用:

<alphaandroid:fromAlpha = "1.0"android:toAlpha = "0.7"/>

integer:整型值。

(1)属性定义:

<declare-styleable name = "AnimatedRotateDrawable"><attr name = "visible" /><attr name = "frameDuration" format="integer" /><attr name = "framesCount" format="integer" /><attr name = "pivotX" /><attr name = "pivotY" /><attr name = "drawable" /></declare-styleable>

(2)属性使用:

<animated-rotatexmlns:android = "/apk/res/android" android:drawable = "@drawable/图片ID" android:pivotX = "50%" android:pivotY = "50%" android:framesCount = "12" android:frameDuration = "100"/>

string:字符串。

(1)属性定义:

<declare-styleable name = "MapView"><attr name = "apiKey" format = "string" /></declare-styleable>

(2)属性使用:

<com.google.android.maps.MapViewandroid:layout_width = "fill_parent"android:layout_height = "fill_parent"android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"/>

fraction:百分数。

(1)属性定义:

<declare-styleable name="RotateDrawable"><attr name = "visible" /><attr name = "fromDegrees" format = "float" /><attr name = "toDegrees" format = "float" /><attr name = "pivotX" format = "fraction" /><attr name = "pivotY" format = "fraction" /><attr name = "drawable" /></declare-styleable>

(2)属性使用:

<rotatexmlns:android = "/apk/res/android"

android:interpolator = “@anim/动画ID”

android:fromDegrees = "0"

android:toDegrees = “360”

android:pivotX = "200%"android:pivotY = "300%"

android:duration = “5000”

android:repeatMode = "restart"android:repeatCount = "infinite"/>

enum:枚举值。

(1)属性定义:

<declare-styleable name="名称"><attr name="orientation"><enum name="horizontal" value="0" /><enum name="vertical" value="1" /></attr> </declare-styleable>

(2)属性使用:

<LinearLayoutxmlns:android = "/apk/res/android"android:orientation = "vertical"android:layout_width = "fill_parent"android:layout_height = "fill_parent"></LinearLayout>

flag:位或运算。

(1)属性定义:

<declare-styleable name="名称"><attr name="windowSoftInputMode"><flag name = "stateUnspecified" value = "0" /><flag name = "stateUnchanged" value = "1" /><flag name = "stateHidden" value = "2" /><flag name = "stateAlwaysHidden" value = "3" /><flag name = "stateVisible" value = "4" /><flag name = "stateAlwaysVisible" value = "5" /><flag name = "adjustUnspecified" value = "0x00" /><flag name = "adjustResize" value = "0x10" /><flag name = "adjustPan" value = "0x20" /><flag name = "adjustNothing" value = "0x30" /></attr> </declare-styleable>

(2)属性使用:

<activityandroid:name = ".StyleAndThemeActivity"android:label = "@string/app_name"android:windowSoftInputMode = "stateUnspecified | stateUnchanged|stateHidden"><intent-filter><action android:name = "android.intent.action.MAIN" /><category android:name = "android.intent.category.LAUNCHER" /></intent-filter></activity>

注意:

属性定义时可以指定多种类型值。

(1)属性定义:

<declare-styleable name = "名称"><attr name = "background" format = "reference|color" /></declare-styleable>

(2)属性使用:

<ImageViewandroid:layout_width = "42dip"android:layout_height = "42dip"android:background = "@drawable/图片ID|#00FF00"/>

转摘/lmj623565791/article/details/24300125

在values文件下创建一个attrs.xml文件

<?xml version="1.0" encoding="utf-8"?><resources><attr name="CustomtitText" format="string"/><attr name="CustomtitTextColor" format="color"/><attr name="CustomtitTextSize" format="dimension"/><attr name="image" format="reference"/><attr name="imageScaleType" ><enum name="fillXY" value="0"/><enum name="center" value="1"/></attr><declare-styleable name="CustomImageView"><attr name="CustomtitText" /><attr name="CustomtitTextColor" /><attr name="CustomtitTextSize" /><attr name="image"/><attr name="imageScaleType"/></declare-styleable></resources>

自定义的View

分三步:解析属性,测量,画图

public class CustomImageView extends View {private static final int IMAGE_SCALE_FITXY = 0;private Bitmap mImage;private int mTextColor;private int mTextSize;private String mTitle;private int mImageScale;private Rect mTextBound;private Paint mPaint;private int mWidth;private int mHeight;private Rect rect;public CustomImageView(Context context) {this(context,null);}public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context,attrs,defStyleAttr);}/*** 初始化的各种属性* @param context* @param attrs* @param defStyleAttr*/private void initView(Context context, AttributeSet attrs, int defStyleAttr) {TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.CustomImageView,defStyleAttr,0);int indexCount = typedArray.getIndexCount();for (int i = 0; i < indexCount; i++) {int index = typedArray.getIndex(i);switch (index){case R.styleable.CustomImageView_image:mImage = BitmapFactory.decodeResource(getResources(), typedArray.getResourceId(index, 0));break;case R.styleable.CustomImageView_imageScaleType:mImageScale = typedArray.getInt(index, 0);break;case R.styleable.CustomImageView_CustomtitText:mTitle = typedArray.getString(index);break;case R.styleable.CustomImageView_CustomtitTextSize:mTextSize = typedArray.getDimensionPixelSize(index, (int) TypedValue.applyDimension(PLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));break;case R.styleable.CustomImageView_CustomtitTextColor:mTextColor = typedArray.getColor(index, Color.BLACK);break;}}typedArray.recycle();rect = new Rect();mPaint = new Paint();mTextBound = new Rect();mPaint.setTextSize(mTextSize);//计算描绘字体需要的范围mPaint.getTextBounds(mTitle,0,mTitle.length(),mTextBound);}public CustomImageView(Context context, AttributeSet attrs) {this(context, attrs,0);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);//判断测量if(widthMode == MeasureSpec.EXACTLY){widthMeasureSpec = widthSize;}else {//由图片决定宽int desireByImage = getPaddingRight() + getPaddingLeft() + mImage.getWidth();//由字体决定宽int desireByTitle = getPaddingLeft() + getPaddingRight() + mTextBound.width();if (widthMode == MeasureSpec.AT_MOST) {int desire = Math.max(desireByImage, desireByTitle);widthMeasureSpec = Math.min(desire, widthSize);}}if(heightMode == MeasureSpec.EXACTLY){heightMeasureSpec = heightSize;}else{int disire = getPaddingTop() + getPaddingBottom() + mImage.getHeight() +mTextBound.height();if(heightMode == MeasureSpec.AT_MOST){heightMeasureSpec = Math.min(disire,heightSize);}}mWidth = widthMeasureSpec;mHeight = heightMeasureSpec;setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);}@Overrideprotected void onDraw(Canvas canvas) {mPaint.setStrokeWidth(4);mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(Color.CYAN);canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint);rect.left = getPaddingLeft();rect.right =mWidth -getPaddingRight();rect.top = getPaddingTop();rect.bottom = getPaddingBottom();mPaint.setColor(mTextColor);mPaint.setStyle(Paint.Style.FILL);/**当前设置的宽度小于字体需要的宽度,将字体改为小号**/if(mTextBound.width()>mWidth){TextPaint paint = new TextPaint(mPaint);String msg = TextUtils.ellipsize(mTitle, paint, (float) mWidth - getPaddingLeft() - getPaddingRight(), TextUtils.TruncateAt.END).toString();canvas.drawText(msg,getPaddingLeft(),mHeight-getPaddingTop(),mPaint);}else {canvas.drawText(mTitle,mWidth/2-mTextBound.width()*1.0f/2,mHeight-getPaddingBottom(),mPaint);}rect.bottom -= mTextBound.height();if(mImageScale ==IMAGE_SCALE_FITXY ){canvas.drawBitmap(mImage,null,rect,mPaint);}else {//计算居中的矩形范围rect.left = mWidth/2-mImage.getWidth()/2;rect.right = mWidth/2 + mImage.getWidth()/2;rect.top = (mHeight - mTextBound.height())/2-mImage.getHeight()/2;rect.bottom = (mHeight - mTextBound.height())/2+mImage.getHeight()/2;canvas.drawBitmap(mImage,null,rect,mPaint);}}}

布局自定义View

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:zhy="/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><com.example.administrator.testapplication.CustomImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:padding="10dp"zhy:image="@mipmap/ic_launcher"zhy:imageScaleType="center"zhy:CustomtitText="hello andorid ! "zhy:CustomtitTextColor="#ff0000"zhy:CustomtitTextSize="30sp" /><com.example.administrator.testapplication.CustomImageViewandroid:layout_width="100dp"android:layout_height="wrap_content"android:layout_margin="10dp"android:padding="10dp"zhy:image="@mipmap/ic_launcher"zhy:imageScaleType="center"zhy:CustomtitText="helloworldwelcome"zhy:CustomtitTextColor="#00ff00"zhy:CustomtitTextSize="20sp" /><com.example.administrator.testapplication.CustomImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:padding="10dp"zhy:image="@mipmap/b"zhy:imageScaleType="center"zhy:CustomtitText="风景~"zhy:CustomtitTextColor="#ff0000"zhy:CustomtitTextSize="12sp" />></LinearLayout>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。