編輯:關於Android編程
Android自定義的view,主要是繼承view,然後實現ondraw這個方法,來進行繪制。
一、編寫自定義的view
1.在xml中使用自己的view
<!-- 可以使用view的公共屬性,例如背景 --> <com.niuli.view.MyView android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" />
2.通過繼承view,然後實現ondraw來實現方法
public class MyView extends View {
Bitmap bitmap;
public MyView(Context context) {
super(context);
/**
* getResources()可以獲取當前資源內的資源
*/
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}
/**
* 繪制是通過Canvas來承載,其就相當於一塊畫布
* 更多的學習將在不斷的做小東西中更新
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**
* Paint相當於一只畫筆,可以畫文字,幾何圖形,bit圖片等
*/
Paint paint = new Paint();
//設置繪制的顏色,是否空心之類的都是對畫筆的設計
paint.setColor(Color.BLUE);
//繪畫文字
paint.setTextSize(30);
canvas.drawText("這是一個自定義view", 0, 30, paint);
//繪畫直線
canvas.drawLine(0, 60, 100, 60, paint);
//繪畫圓角矩形方法之一
//設置空心
paint.setStyle(paint.getStyle().STROKE);
RectF rec = new RectF(0, 90, 100, 190);
canvas.drawRoundRect(rec, 20, 20, paint);
//繪制圖片
canvas.drawBitmap(bitmap, 0, 350, paint);
}
}
效果

二、自定義的view+線程的使用控制
繪制文字,和圓形,通過線程控制使得其能在屏幕中移動
public class MyViewtwo extends View {
//定義畫筆
private Paint paint = new Paint();
private int x;
private float sweepAngle;
private control thread;
private Random random = new Random();
public MyViewtwo(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyViewtwo(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
paint.setTextSize(80);
//繪制文字
canvas.drawText("七夕快樂", x, 70, paint);
//繪制圖形
RectF rect = new RectF(0 ,80 ,100, 160);
canvas.drawArc(rect, 0, sweepAngle, true, paint);
//啟動線程
if (thread ==null) {
thread = new control();
thread.start();
}
}
public class control extends Thread{
@Override
public void run() {
while(true){
x +=3;
sweepAngle++;
if (x>getWidth()) {
x = (int) (0 - paint.measureText("七夕快樂"));
}
//控制圓的的旋轉
if (sweepAngle>360) {
sweepAngle = 0;
}
//設置畫筆顏色
paint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
//相當於刷新畫布
postInvalidate();
try {
sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
效果

三、封裝移動程序,模塊化思想
封裝主要是使用抽象方法,子類繼承後只要實現這些方法即可運行起來,大大簡化了程序
public abstract class MyViewtwo extends View {
private control thread;
public MyViewtwo(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyViewtwo(Context context) {
super(context);
}
//封裝,構造畫面,子類繼承後需要重寫
protected abstract void drawsub(Canvas canvas);
@Override
protected final void onDraw(Canvas canvas) {
//啟動線程
if (thread ==null) {
thread = new control();
thread.start();
}else {
drawsub(canvas);
}
}
//封裝移動方法,子類繼承後需要重寫
protected abstract void move();
public class control extends Thread{
@Override
public void run() {
while(true){
move();
//相當於刷新畫布
postInvalidate();
try {
sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
四、使用xml中定義樣式影響顯示效果
1、第一步就是在value文件夾中建立自己的樣式文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="NumText"> <attr name="lineNum" format="integer"/> <attr name="xScroll" format="boolean" /> </declare-styleable> </resources>
2、xml中先要加入命名空間,然後就可以直接使用屬性
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:nt="http://schemas.android.com/apk/res/com.jikexueyuan.myview" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" > <com.jikexueyuan.myview.v4.NumText android:layout_width="match_parent" android:layout_height="match_parent" nt:lineNum="6" nt:xScroll="true"/> </FrameLayout>
3、代碼中要有相應的解析xml中定義的這個元素
public NumText(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NumText);
lineNum = ta.getInt(R.styleable.NumText_lineNum, 1);
xScroll = ta.getBoolean(R.styleable.NumText_xScroll, false);
ta.recycle();
}
主要就是利用以上方法和xml中定義元素值進行曝光相關聯。
以上就是本文的全部內容,希望對大家的學習有所幫助。
Qt for Android 編譯安卓原生可執行程序
作為 C/C++ 程序員,有時候我們希望在安卓上運行從 C/C++ 生成的可執行程序,而不是在 Java 中通過 jni 的方式來調用 C
Android app開發中Retrofit框架的初步上手使用
Retrofit 2.0先來說一下Retrofit 2.0版本中一些引人注意的地方。在Retrofit 2.0中,最大的改動莫過於減小庫的體積,首先,Retrofit 2
Android游戲開發之碰撞檢測(矩形碰撞、圓形碰撞、像素碰撞)
本文為大家分享了Android游戲開發之碰撞檢測,供大家參考,具體內容如下矩形碰撞 原理: 兩個矩形位置 的四種情況 不是這四中情況 則碰撞圓形碰撞 原理: 利用兩個圓心
帶你實現開發者頭條APP(五)--RecyclerView下拉刷新上拉加載
一 、前言最近實在太忙,一個多禮拜沒有更新文章了,於是今晚加班加點把demo寫出來,現在都12點了才開始寫文章。1.我們的目標把RecyclerView下拉刷新上拉加載更