基礎UI控件 Cannas Drawable 複雜的TextView

UI的呈現 & UI事件

一、UI就是View

android中,UI就是View,所有界面組件繼承於View類

這裏寫圖片描述

動態生成界面代碼例子:

package com.example.chenjinhua.graphic;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;

public class CustomViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = new LinearLayout(this);

        //相當於xml裏設置LinearLayout的寬高爲MATCH_PARENT.
        linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));

        Button button = new Button(this);
        button.setText("jinhua Button");

        //把Button加進父容器裏.
        linearLayout.addView(button);

        setContentView(linearLayout);
    }
}

運行結果,模擬器顯示爲:
這裏寫圖片描述

用Hierarchy View查看層級關係:
這裏寫圖片描述

(1)、除了LinearLayout和Button,其餘都是系統自動生成的;
(2)、FrameLayout以及TextView是Graphic這行.

界面顯示機制:Canvas 和 Drawable

用Canvas畫元素

CustomView類:

package jinhua.demo.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

//定義一個類繼承View
public class CustomView extends View {

    public CustomView(Context context) {
        super(context);
    }

    //重寫onDraw方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        canvas.drawRect(10,10,80,80,paint);

    }
}

CustomViewActivity代碼:

package com.example.chenjinhua.graphic;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import jinhua.demo.view.CustomView;

public class CustomViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(new CustomView(this));
    }
}

用Drawable類來獲取Drawable類型資源:

Drawable的好處:用了一種簡單的方式替代了canvas,且和資源文件關聯起來了。
Drawable必須setBounds()。

這裏寫圖片描述
DrawableView類:

package com.example.chenjinhua.drawableview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;

/**
 * Created by chenjinhua on 16/2/15.
 */
public class DrawableView extends View {
    BitmapDrawable bitmapDrawable;


    public DrawableView(Context context) {
        super(context);

        bitmapDrawable = (BitmapDrawable) getResources().getDrawable(R.drawable.girl);
        bitmapDrawable.setBounds(10,10,135,150);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        bitmapDrawable.draw(canvas);
    }
}

DrawableViewActivity類:

package com.example.chenjinhua.drawableview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class DrawableViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        DrawableView drawableView = new DrawableView(this);
        setContentView(drawableView);
    }
}

二、TextView
1、View的通用屬性
2、設置autoLink
3、設置圖片
4、HTML
5、更靈活的Span
6、設置跑馬燈
7、事件
8、關於主題

例子 - 設置圖片和設置autoLink

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello jinhua,。電話是:18818209888,郵箱是[email protected],新浪主頁是http://www.baidu.com"
        android:textSize="20sp"
        android:textColor="#ff0000"
        android:hint="no data"
        android:singleLine="false"
        android:drawableLeft="@drawable/girl"
        android:drawablePadding="10dp"
        android:layout_marginLeft="10dp"
        android:autoLink="web"
        android:textColorLink="#0000ff"
        android:background="@drawable/girl"/>

</LinearLayout>

其中 android:drawableLeft=”@drawable/girl”//設置左邊圖片;
android:background=”@drawable/girl” //設置背景圖

android:autoLink="web";//web鏈接可跳轉
android:autoLink="phone"; //phone電話可跳轉
android:autoLink="all"//底層支持的都可以跳轉android:textColorLink="#0000ff" //設置鏈接顏色

所有xml文件裏的屬性設置,也可以用代碼在Activity裏設置,如下用TextView顯示從Html字符串中可顯示的樣式文本(使用Spanned):

package com.example.chenjinhua.formwidgit;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.text.Spanned;
import android.widget.TextView;

public class FormWidgitActivity extends AppCompatActivity {

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

    public void showTextView(){
       TextView textView1 = (TextView)findViewById(R.id.textView1);
        String html = "<body>中國你好</body>"
                + "<b>中國你好</b>"
                +"<h1>中國你好</h1>"
                +"<font color='#0000ff'>中國你好</font>"
                + "<img src='Qhttps://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png' />";
        Spanned spanned = Html.fromHtml(html);
        textView1.setText(spanned);
    }
}

定義了一個showTextView()方法,該方法覆蓋了xml文件裏定義的TextView的文本內容;
TextView.setText(“String”)方法裏的String是spanned;
從運行結果看出未顯示html裏圖片,要實現圖片的顯示需要使用Html.fromHtml的另外一個重構方法。

運行結果爲:
這裏寫圖片描述

TextView顯示Html圖片(圖片來源於Drawable資源):

package com.example.chenjinhua.formwidgit;

import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.text.Spanned;
import android.widget.TextView;

import static android.text.Html.fromHtml;

public class FormWidgitActivity extends AppCompatActivity {

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

    public void showTextView(){
       TextView textView1 = (TextView)findViewById(R.id.textView1);
        String html = "<body>中國你好</body>"
                + "<b>中國你好</b>"
                +"<h1>中國你好</h1>"
                +"<font color='#0000ff'>中國你好</font>"
                + "<img src='Qhttps://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png' />";
        Html.ImageGetter imageGetter = new Html.ImageGetter(){
            @Override
            public Drawable getDrawable(String s) {
                if(s != null){
                    BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(R.drawable.girl);
                    bitmapDrawable.setBounds(0,0,bitmapDrawable.getIntrinsicWidth(),bitmapDrawable.getIntrinsicHeight());
                    return bitmapDrawable;
                }else{
                    return null;
                }

            }
        };

        Spanned spanned = fromHtml(html,imageGetter,null);
        textView1.setText(spanned);
    }
}

運行結果爲:

這裏寫圖片描述

注意Drawable必須setBounds()。否則默認圖片都不顯示。

更靈活的Span - Android字符串中加圖片或者修改字符串樣式:

SpannableString、SpannableStringBuilder與String的關係:
首先SpannableString、SpannableStringBuilder基本上與String差不多,也是用來存儲字符串,但它們倆的特殊就在於有一個SetSpan()函數,能給這些存儲的String添加各種格式或者稱樣式(Span),將原來的String以不同的樣式顯示出來,比如在原來String上加下劃線、加背景色、改變字體顏色、用圖片把指定的文字給替換掉,等等。所以,總而言之,SpannableString、SpannableStringBuilder與String一樣, 首先也是傳字符串,但SpannableString、SpannableStringBuilder可以對這些字符串添加額外的樣式信息,但String則不行。

package com.example.chenjinhua.formwidgit;

import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ImageSpan;
import android.widget.TextView;

public class FormWidgitActivity extends AppCompatActivity {

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

    public void showTextView(){
       TextView textView1 = (TextView)findViewById(R.id.textView1);

        BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(R.drawable.girl);
        bitmapDrawable.setBounds(0,0,bitmapDrawable.getIntrinsicWidth(),bitmapDrawable.getIntrinsicHeight());

        //構造SpannedString
        SpannableString spannableString = new SpannableString("今天天氣真是棒,紅色打電話圖片");
        ImageSpan imageSpan = new ImageSpan(bitmapDrawable,ImageSpan.ALIGN_BASELINE);
        spannableString.setSpan(imageSpan,13,14,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView1.setText(spannableString);
    }
}

運行結果爲:

這裏寫圖片描述

設置跑馬燈:
xml屬性添加設置爲:

        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章