Android布局文件.xml中的自定义属性(结合封装的自定义View)
16lz
2021-01-26
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cctvjiatao.xmlset" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity2" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
com.cctvjiatao.xmlset.MainActivity2
package com.cctvjiatao.xmlset;import android.app.Activity;import android.os.Bundle;public class MainActivity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);}}
activity_main2.xml
<!-- xmlns:jiatao="http://schemas.android.com/apk/res/com.cctvjiatao.xmlset" xmlns:[自定义命名] = "http://schemas.android.com/apk/res/[本xml所属activity的包名]"--><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:jiatao="http://schemas.android.com/apk/res/com.cctvjiatao.xmlset" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.cctvjiatao.xmlset.MainActivity2" > <!-- 一定要写正确自定义View的“包名+类名”,不然汇报错:Binary XML file line #9: Error inflating class.. --> <com.cctvjiatao.xmlset.TestView2 android:layout_width="match_parent" android:layout_height="match_parent" jiatao:isScroll="true" jiatao:linesNum="10" > </com.cctvjiatao.xmlset.TestView2></RelativeLayout>
com.cctvjiatao.xmlset.BaseView
package com.cctvjiatao.xmlset;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.View;/** * @作者: jiatao * @修改时间:2016-3-12 下午9:12:42 * @包名:com.cctvjiatao.xmlset * @文件名:BaseView.java * @版权声明:www.cctvjiatao.com * @功能: 自定义View的封装类 */public abstract class BaseView extends View {private DrawThread thread;private boolean isRunning = true;private long time = 30;public BaseView(Context context) {super(context);}public BaseView(Context context, AttributeSet attrs) {super(context, attrs);}protected abstract void drawSub(Canvas canvas);protected abstract void drawLogic();@Overrideprotected void onDraw(Canvas canvas) { if(thread == null){ thread = new DrawThread(); thread.start(); }else{ drawSub(canvas); }}@Overrideprotected void onDetachedFromWindow() { super.onDetachedFromWindow(); isRunning = false;}class DrawThread extends Thread{@Overridepublic void run() {while(isRunning){drawLogic();postInvalidate();try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); }}}}}
com.cctvjiatao.xmlset.TestView2
package com.cctvjiatao.xmlset;import com.cctvjiatao.xmlset.R;import com.cctvjiatao.xmlset.R.styleable;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;/** * @作者: jiatao * @修改时间:2016-3-12 下午9:24:29 * @包名:com.cctvjiatao.xmlset * @文件名:TestView.java * @版权声明:com.cctvjiatao.xmlset.test * @功能: 测试类,在xml中设置属性 */public class TestView2 extends BaseView {private int linesNum = 0;private boolean isScroll = false;private float xStart = 0;private Paint paint = new Paint();public TestView2(Context context) {super(context);}public TestView2(Context context, AttributeSet attrs) {super(context, attrs);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.JiataoNumText);linesNum = ta.getInt(R.styleable.JiataoNumText_linesNum, 1);isScroll = ta.getBoolean(R.styleable.JiataoNumText_isScroll, false);ta.recycle();}@Overrideprotected void drawSub(Canvas canvas) {for(int i=0; i<linesNum; i++){int textSize = 30+i;paint.setTextSize(textSize);canvas.drawText("cctvjiatao", xStart, textSize*(1+i), paint);}}@Overrideprotected void drawLogic() {if(isScroll){xStart += 3;if(xStart > getWidth()){xStart = 0 - paint.measureText("cctvjiatao");}}else{return;}}}res/values/attrs.xml(新建的xml)
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="JiataoNumText"> <attr name="linesNum" format="integer"/> <attr name="isScroll" format="boolean" /> </declare-styleable></resources>
运行结果:
更多相关文章
- Android(安卓)监听锁屏、解锁、开屏 功能代码
- Qt在Android平台上实现html转PDF的功能
- Android(安卓)Calendar的学习与运用
- Android(安卓)Code Review
- ImageLoader修改后
- MT6735修改听筒增益
- Android(安卓)监听开机完成广播,完成监听SIM卡功能
- Androidstudio实现手机摇一摇功能
- 佛祖保佑 永无BUG 永不修改