国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁(yè) > 系統(tǒng) > Android > 正文

Android自定義表格控件滿(mǎn)足人們對(duì)視覺(jué)的需求

2020-04-11 12:31:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Android平臺(tái)已經(jīng)給我們提供了很多標(biāo)準(zhǔn)的組件,如:TextView、EditView、Button、ImageView、Menu等,還有許多布局控件,常見(jiàn)的有:AbsoluteLayout、LinerLayout、RelativeLayout、TableLayout等。但隨著人們對(duì)視覺(jué)的需求,基本組件已無(wú)法滿(mǎn)足人們求新求異的要求,于是我們常常會(huì)自定義組件,用來(lái)實(shí)現(xiàn)更美觀(guān)的UI界面。

實(shí)現(xiàn)自定義控件通常有兩種途徑,一種是繼承View類(lèi),重寫(xiě)其中的重要方法,另一種是繼承ViewGroup類(lèi),通過(guò)重寫(xiě)父類(lèi)中的有些方法,達(dá)到重新繪制組件的目的。最近做了一個(gè)自定義表格控件的練習(xí),從中總結(jié)到一些經(jīng)驗(yàn)。在這個(gè)練習(xí)中,我通過(guò)繼承ViewGroup類(lèi),重新繪制了用于呈現(xiàn)表格樣式的容器組件,首先來(lái)看一下父類(lèi)ViewGroup。該類(lèi)有三個(gè)構(gòu)造方法:ViewGroup(Context context)、ViewGroup(Context context,AttributeSet attrs)、ViewGroup(Context context,AttributeSet attrs,int defStyle),我們自定義的繼承ViewGroup的類(lèi)需要實(shí)現(xiàn)它的至少一個(gè)構(gòu)造方法。ViewGroup中有幾個(gè)方法非常重要,這幾個(gè)方法更好的幫助我們實(shí)現(xiàn)自己的組件的布局與繪制。

1、onLayout方法

該方法用于在容器中如何擺放子控件,如果不重寫(xiě)該方法,子控件將無(wú)法在布局控件中得以展示,該方法有五個(gè)參數(shù),用于設(shè)置子控件的上下左右四個(gè)邊框的位置,還有一個(gè)標(biāo)志位,這個(gè)方法也是子類(lèi)必須實(shí)現(xiàn)的,因?yàn)樵摲椒ㄊ莻€(gè)抽象方法。

2、addView方法

該方法用于在容器組件中添加子控件

3、dispatchDraw方法

通過(guò)該方法,我們可以獲取canvas對(duì)象,該對(duì)象允許我們?cè)诮M件上畫(huà)任意我們想要的圖形,在這個(gè)表格控件中,我們可以在畫(huà)布上上表格的外邊框及表格線(xiàn)

4、getChildCount和getChildAt方法

這兩個(gè)方法用于獲取該容器控件中子控件的數(shù)目和位置,便于我們對(duì)子控件的排版和布局

5、onMeasure方法

這個(gè)方法是用來(lái)測(cè)量子控件大小的,它在onLayout方法之前被調(diào)用,測(cè)量了子控件的大小尺寸,然后可以繪制子控件在容器組件中的布局位置

下面直接給出代碼示例,僅供參考

首先是表格控件的類(lèi):

復(fù)制代碼 代碼如下:

public class TableView extends ViewGroup{
private static final int STARTX = 0;// 起始X坐標(biāo)
private static final int STARTY = 0;// 起始Y坐標(biāo)
private static final int BORDER = 2;// 表格邊框?qū)挾?
private int mRow;// 行數(shù)
private int mCol;// 列數(shù)
public TableView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mRow = 3;// 默認(rèn)行數(shù)為3
this.mCol = 3;// 默認(rèn)列數(shù)為3
// 添加子控件
this.addOtherView(context);
}
public TableView(Context context, int row,int col) {
super(context);
if(row>20 || col>20){
this.mRow = 20;// 大于20行時(shí),設(shè)置行數(shù)為20行
this.mCol = 20;// 大于20列時(shí),設(shè)置列數(shù)為20列
}else if(row==0 || col==0){
this.mRow = 3;
this.mCol = 3;
}
else{
this.mRow = row;
this.mCol = col;
}
// 添加子控件
this.addOtherView(context);
}
public void addOtherView(Context context){
int value = 1;
for(int i=1;i<=mRow;i++){
for(int j=1;j<=mCol;j++){
TextView view = new TextView(context);
view.setText(String.valueOf(value++));
view.setTextColor(Color.rgb(79, 129, 189));
view.setGravity(Gravity.CENTER);
if(i%2==0){
view.setBackgroundColor(Color.rgb(219, 238, 243));
}else{
view.setBackgroundColor(Color.rgb(235, 241, 221));
}
this.addView(view);
}
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setStrokeWidth(BORDER);
paint.setColor(Color.rgb(79, 129, 189));
paint.setStyle(Style.STROKE);
// 繪制外部邊框
canvas.drawRect(STARTX, STARTY, getWidth()-STARTX, getHeight()-STARTY, paint);
// 畫(huà)列分割線(xiàn)
for(int i=1;i<mCol;i++){
canvas.drawLine((getWidth()/mCol)*i, STARTY, (getWidth()/mCol)*i, getHeight()-STARTY, paint);
}
// 畫(huà)行分割線(xiàn)
for(int j=1;j<mRow;j++){
canvas.drawLine(STARTX, (getHeight()/mRow)*j, getWidth()-STARTX, (getHeight()/mRow)*j, paint);
}
super.dispatchDraw(canvas);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int x = STARTX+BORDER;
int y = STARTY+BORDER;
int i = 0;
int count = getChildCount();
for(int j=0; j<count; j++){
View child = getChildAt(j);
child.layout(x, y, x+getWidth()/mCol-BORDER*2, y+getHeight()/mRow-BORDER*2);
if(i >=(mCol-1)){
i = 0;
x = STARTX+BORDER;
y += getHeight()/mRow;
}else{
i++;
x += getWidth()/mCol;
}
}
}
public void setRow(int row){
this.mRow = row;
}
public void setCol(int col){
this.mCol = col;
}
}

然后我們?cè)贏ctivity中使用我們的控件:
復(fù)制代碼 代碼如下:

public class MainActivity extends Activity implements OnClickListener{
private Button btn;
private EditText row;
private EditText col;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.button1);
row = (EditText)findViewById(R.id.editRow);
col = (EditText)findViewById(R.id.editCol);
row.setError("請(qǐng)輸入小于20的整數(shù)");
col.setError("請(qǐng)輸入小于20的整數(shù)");
btn.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
Intent intent = new Intent();
Bundle bun = new Bundle();
if("".equals(row.getText().toString())){
Toast.makeText(this, "行數(shù)不能為空", Toast.LENGTH_SHORT).show();
return;
}else if("".equals(col.getText().toString())){
Toast.makeText(this, "列數(shù)不能為空", Toast.LENGTH_SHORT).show();
return;
}else{
int rowNum = Integer.parseInt(row.getText().toString());
int colNum = Integer.parseInt(col.getText().toString());
bun.putInt("row", rowNum);
bun.putInt("col", colNum);
intent.setClass(MainActivity.this, TableActivity.class);
intent.putExtras(bun);
startActivity(intent);
}
}
}

復(fù)制代碼 代碼如下:

public class TableActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = this.getIntent();
Bundle bun = intent.getExtras();
int row = bun.getInt("row");
int col = bun.getInt("col");
TableView table = new TableView(this, row, col);
setContentView(table);
}
}

效果圖如下:

         

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
中文字幕在线观看av| 尤物网址在线观看| 国产xxxx做受性欧美88| www.狠狠操| 夜夜操天天干| 在线a人片免费观看视频| 最近免费中文字幕在线第一页| av中文网站| 日本成人a视频| 日本片在线看| 国产成人午夜精品| 丁香六月婷婷| 日本中文字幕在线观看| 国产在线黄色片| 在线a人片免费观看视频| 国产福利视频在线| 国产精品视频二区三区| 国产日韩欧美精品一区二区三区| 粉嫩av一区| 国产亚洲依依| 2019中文字幕在线视频| 最新天堂资源在线资源| 国产精选在线观看| 88av在线| 国产不卡视频| 天天操人人干| 九九热免费在线视频| 国产精品自产拍在线观看2019| 牛牛热在线视频| 日本三级在线视频| 欧美啪啪精品| 国产一二在线观看| 精品国产福利一区二区在线| 亚洲精品国自产拍在线观看| 69国产精品| 国产精品入口麻豆免费| 99在线视频观看| 国产你懂的在线观看| 国产高清免费视频| 亚洲天堂电影在线观看| 国内精品免费一区二区三区| 国产精品入口麻豆电影| 欧美xxxxx性| 国产桃色电影在线播放| 91麻豆免费在线视频| www免费在线观看视频| 在线三级av| 国产精品一区二区婷婷| 91涩漫在线观看c| 亚洲va国产日韩欧美精品色婷婷| 国产一级片在线播放| eeuss影院在线| 国产第一页在线视频 | 中文资源在线官网| 欧美a免费在线| 精品成人一区二区三区免费视频| 国产精选一区二区三区不卡催乳| 精品麻豆国产| 最近中文字幕在线中文视频 | 国产原创精品视频| xxx国产精品| av一本在线| 日本高清中文字幕二区在线| 国产免费一级片| 交换国产精品视频一区| 精品女厕厕露p撒尿| 激情小说 在线视频| 国产精美视频| 国产一区电影| 国产秀色在线www免费观看| 免费看黄视频网站| 黄色片视频在线观看| xxxx视频在线| 国产91足控脚交在线观看| 国产黄色免费| 国产精品乱码一区二区三区视频| 国产亚洲精品一区二区在线观看| 国产对白叫床清晰在线播放| 日本在线观看网站| 福利视频网址导航| 国产一级免费在线观看| 国产二级片在线| 日本在线观看| 最近最好的中文字幕2019免费| 最新黄网在线观看| 精品成人一区二区三区免费视频| 在线三级中文| 中文字幕免费在线视频| 国产一区二区在线|播放| 国产一区二区影视| 国产成人va亚洲电影| 国产在线二区| 国产美女极品在线| 精品欧美色视频网站在线观看| www亚洲天堂| 青青草免费在线视频| 老鸭窝av在线| 国产区av在线| 亚洲电影视频在线| 国产三级在线| av在线资源网| 激情视频国产| 亚洲精品手机在线| 国产性网软件大全| 免费女人毛片视频| 91最新在线| 日本中文字幕在线看| 亚洲人av在线| 国产精品免费视频一区一| 日本黄在线观看| 国产porny蝌蚪视频| 最新黄网在线观看| 国产永久免费高清在线观看| 2019中文字幕视频| 国产不卡视频| 国产精品伦一区二区三区级视频频 | 九九热视频在线观看| 中文字幕在线视频免费观看| 欧美日韩**字幕一区| 国产精品欧美韩国日本久久| 国产精品午夜久久久久久| 日韩中文字幕久久久经典网| 日本中文字幕高清视频| 国产永久免费高清在线观看视频| eeuss影院www在线播放| 2018狠狠干| 97影院理论午夜| 国产视频xxx| 中文字幕在线观看日本| 超碰免费在线观看| 日本高清不卡中文字幕| 牛牛热在线视频| 欧美成人亚洲高清在线观看| 国产免费视频在线| 国产精品久久久久白浆| 国产黄色在线网站| 国产日产精品久久久久久婷婷| 国产欧美久久久久久久久 | 日本在线观看| 高清视频一区二区三区四区| 国产无遮挡又黄又爽免费软件| 18成年在线观看| 超碰在线观看免费版| 国产免费一级| 国产免费av在线| 国产永久免费高清在线观看视频| 尤物视频在线免费观看| 伊人免费在线| 激情丁香婷婷| 国产h在线观看| 任你操在线观看| 国产一区电影| 亚色视频在线观看| 国产在线二区| 亚洲久草视频| 中文字幕国产欧美| 在线免费黄色毛片| 高清欧美精品xxxxx在线看| 91三级在线| 蜜桃av在线免费观看| 国产婷婷视频在线| 亚洲an天堂an在线观看| 国产美女福利在线观看| 国产精品视频h| 日韩黄色成人| 96精品视频| 国产一级黄色片免费| 日本在线观看网站| 中文天堂av| 精品欧美日韩一区二区| 天堂资源在线中文| www.99av| 青青青手机在线视频观看| 在线一区二区三区精品| 国产无遮挡又黄又爽免费软件| 交换国产精品视频一区| 四虎国产精品永久在线| 精品日韩av| 国产高清在线a视频大全| 自拍av在线| 最好2018中文免费视频| 成人精品福利| 亚洲人成电影| 亚色视频在线观看| 国产在线观看网站| 久久精品最新免费国产成人| 国产三级视频在线看| 国产在线一二| 狠狠操天天操夜夜操| 国产美女在线播放| 国产在线观看a| 国产精品jvid在线观看| 中文字幕在线观看播放| 国产嫩草在线视频| 久草.com| 国产二级c片l毛片| xxxxx中文字幕| 国产乱妇乱子| 2019中文字幕在线电影免费| 91av福利|