Android自定義View 屬性新增

yayun0516發表於2017-06-04

 

昨天寫的自定義View,所有的屬性都是寫死的,擴充性基本為零。今天講解自定義View屬性的設定,首先在res的values資料夾下建立一個attrs.xml檔案。程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <declare-styleable name="ScrollTextView">
       <attr name="textSize" format="dimension"></attr>
       <attr name="textColor" format="color"></attr>
       <attr name="textString" format="string"></attr>
       <attr name="scrollVelocity" format="enum">
           <enum name="slow" value="1"></enum>
           <enum name="midd" value="2"></enum>
           <enum name="fast" value="3"></enum>
       </attr>
   </declare-styleable>
</resources>


這裡新增了四個屬性,其中scrollVelocity設定為列舉型別,有三個屬性值。在自定義控制元件裡要獲取這些屬性值,自定義View程式碼如下:


public class ScrollTextView extends View {
private Paint paint;
   private int x = 0;
   private MyThread myThread;
   private int textSize;
   private int color;
   private int value;
   private int speed;
   private String text;

   public ScrollTextView(Context context) {
this(context, null);
       init();
   }

public ScrollTextView(Context context, AttributeSet attrs) {
super(context, attrs);
       TypedArray ta = context.obtainStyledAttributes(attrs,
               R.styleable.ScrollTextView);
       textSize = (int) ta.
getDimension(R.styleable.ScrollTextView_textSize, 45);
       color = ta.
getColor(R.styleable.ScrollTextView_textColor, Color.RED);
       value = ta.
getInt(R.styleable.ScrollTextView_scrollVelocity, 0);
       text = ta.
getString(R.styleable.ScrollTextView_textString);
       if (value == 1) {
speed = 1;
       } else if (value == 2) {
speed = 2;
       } else {
speed = 3;
       }
init();
       ta.recycle();
   }

private void init() {
paint = new Paint();
       paint.setTextSize(textSize);
       paint.setColor(color);
       if (myThread == null) {
myThread = new MyThread();
           myThread.start();
       }
}

@Override
   protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
       canvas.drawText(text, x, 70, paint);
   }

class MyThread extends Thread {
@Override
       public void run() {
while (true) {
x += speed;
               if (x > getWidth()) {
x = (int) -paint.measureText(text);
               }
postInvalidate();
               try {
Thread.sleep(5);
               } catch (InterruptedException e) {
e.printStackTrace();
               }
}
}
}
}


在構造方法裡呼叫obtainStyledAttributes方法得到TypeArray物件,就可以以此獲得各個屬性值了。

在activity_main.xml裡呼叫這個控制元件和新增自定義的屬性,如下:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:yayun="http://schemas.android.com/apk/res-auto"
   android:id="@+id/activity_main"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <ad.scrolltextview.ScrollTextView
       android:layout_width="match_parent"
       android:layout_height="60dp"
       yayun:scrollVelocity="slow"
       yayun:textColor="@color/colorPrimaryDark"
       yayun:textSize="80px"
       yayun:textString="TANGTANGTANG" />
</RelativeLayout>


MainActivity.java程式碼如下:

public class MainActivity extends AppCompatActivity {

@Override
   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
   }
}


執行例項如下:

 

 

 

 

可以在佈局檔案中修改屬性如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:yayun="http://schemas.android.com/apk/res-auto"
   android:id="@+id/activity_main"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <ad.scrolltextview.ScrollTextView
       android:layout_width="match_parent"
       android:layout_height="60dp"
       yayun:scrollVelocity="fast"
       yayun:textColor="@color/colorAccent"
       yayun:textSize="40px"
       yayun:textString="TANGBAOBAO" />
</RelativeLayout>


再次執行例項如下:


 


 


如果您喜歡,請轉發至朋友圈,在此感謝。

 


相關文章