免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
模仿網(wǎng)易新聞客戶端

這幾天找工作閑來(lái)沒(méi)事,偶然在一個(gè)論壇上面看到有人模擬網(wǎng)易新聞客戶端首頁(yè)頂部那個(gè)組件效果,一時(shí)興起,也來(lái)自己動(dòng)手完整地模擬一個(gè),包括頂部的特效組件和底部的類似于TabHost的組件。下面就動(dòng)手一步一步地Coding...

二、效果截圖

本來(lái)想找個(gè)軟件動(dòng)態(tài)截圖,但是好像沒(méi)找著。。。這樣的話,看不出來(lái)點(diǎn)擊之后的動(dòng)態(tài)切換效果了。以后找著了再來(lái)替換。

三、底部類似TabHost組件切換效果的實(shí)現(xiàn)

為了便于大家親自動(dòng)手實(shí)踐,這里的講解順序就按照開(kāi)發(fā)的順序來(lái)講,所以先做這個(gè)底部的“TabHost”,然后再具體來(lái)實(shí)現(xiàn)里面的五個(gè)頁(yè)面布局。
類似于圖3到圖5三張圖片所示,當(dāng)點(diǎn)擊“新聞”或者“話題”或者“投票”的時(shí)候,有個(gè)稍微透明的紅色背景的ImageView做相應(yīng)的移動(dòng)。這 其實(shí)就是給ImageView設(shè)置了一個(gè)位移動(dòng)畫,當(dāng)點(diǎn)擊事件觸發(fā)的時(shí)候,首先切換點(diǎn)擊后的圖片(有點(diǎn)類似于按下效果的圖片),然后開(kāi)始移動(dòng)鋪在上面的紅 色圖片,讓用戶感覺(jué)到有移動(dòng)的過(guò)程,增強(qiáng)用戶體驗(yàn)。
關(guān)于這個(gè)位移動(dòng)畫,需要用到TranslateAnimation類,移動(dòng)的核心代碼也就幾行,因?yàn)檫@個(gè)移動(dòng)功能不但在底部控件上使用,而且在頂部也使用了,所以,為了以后使用方便,我們把它單獨(dú)定義在一個(gè)類里面MoveBg.java
View Code
里面的各個(gè)參數(shù)有相應(yīng)的說(shuō)明。
然后就來(lái)開(kāi)發(fā)這個(gè)帶有TabHost功能的組件。根據(jù)文檔http://developer.android.com/resources/tutorials/views/hello-tabwidget.html說(shuō) 明,在xml中定義TabHost的時(shí)候,必須使用TabWidget和FrameLayou兩個(gè)組件,而且它們的id也應(yīng)該是 android:id="@android:id/tabs"和android:id="@android:id/tabcontent",由于系統(tǒng)提供 的TabHost界面不怎么好看,所以這里想到自己來(lái)定義它,但是這兩個(gè)組件是不可以不寫的,這里,把TabWidget界面隱藏掉了,取而代之的是 RadioGroup組件來(lái)實(shí)現(xiàn)底部類似于TabHost的控件。具體布局代碼如main.xml
View Code
注意里面的RadioButton組件,當(dāng)初測(cè)試的時(shí)候沒(méi)有設(shè)置android:button="@null",只設(shè)置了 background="@drawable/..."屬性(這是一個(gè)selector屬性,可以在xml文件中定義一些控件的按下效果,或者獲取焦點(diǎn)等 不同狀態(tài)下的資源),出現(xiàn)點(diǎn)擊不切換圖片的問(wèn)題。
對(duì)應(yīng)的selector文件對(duì)應(yīng)如下tab_selector_news.xml
View Code
其它幾個(gè),只是替換不同的圖片資源罷了,不再一一列出。這些資源文件放在res目錄下的drawable文件夾下(如果沒(méi)有,則新建)
有了布局文件,還需要在Activity中設(shè)置一下,為每個(gè)TabHost添加具體的Tab頁(yè)面,如下
tabHost = getTabHost();
tabHost.addTab(tabHost.newTabSpec("news").setIndicator("News").setContent(new Intent(this, TabNewsActivity.class)));
tabHost.addTab(tabHost.newTabSpec("topic").setIndicator("Topic").setContent(new Intent(this, TabTopicActivity.class)));
tabHost.addTab(tabHost.newTabSpec("picture").setIndicator("Picture").setContent(new Intent(this, TabPicActivity.class)));
tabHost.addTab(tabHost.newTabSpec("follow").setIndicator("Follow").setContent(new Intent(this, TabFollowActivity.class)));
tabHost.addTab(tabHost.newTabSpec("vote").setIndicator("Vote").setContent(new Intent(this, TabVoteActivity.class)));
當(dāng)然,相應(yīng)的目標(biāo)Activity自然暫且隨意創(chuàng)建
然后為RadioGroup設(shè)置選擇改變事件監(jiān)聽(tīng)器,當(dāng)選擇改變,改變TabHost中當(dāng)前顯示的Activity頁(yè)面
private OnCheckedChangeListener checkedChangeListener = new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radio_news:
tabHost.setCurrentTabByTag("news");
break;
case R.id.radio_topic:
tabHost.setCurrentTabByTag("topic");
break;
case R.id.radio_pic:
tabHost.setCurrentTabByTag("picture");
break;
case R.id.radio_follow:
tabHost.setCurrentTabByTag("follow");
break;
case R.id.radio_vote:
tabHost.setCurrentTabByTag("vote");
break;

default:
break;
}
}
};
至此就實(shí)現(xiàn)了一個(gè)自定義的“TabHost”,接下來(lái)再添加那個(gè)移動(dòng)的特效

頁(yè)面上的

是一個(gè)RelativeLayout布局,我只是在這個(gè)layout上面添加了一個(gè)ImageView,然后當(dāng)點(diǎn)擊的時(shí)候,移動(dòng)它的位置來(lái)實(shí)現(xiàn)效果

private OnCheckedChangeListener checkedChangeListener = new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radio_news:
tabHost.setCurrentTabByTag("news");
// moveFrontBg(img, startLeft, 0, 0, 0);
MoveBg.moveFrontBg(img, startLeft, 0, 0, 0);
startLeft = 0;
break;
case R.id.radio_topic:
tabHost.setCurrentTabByTag("topic");
MoveBg.moveFrontBg(img, startLeft, img.getWidth(), 0, 0);
startLeft = img.getWidth();
break;
case R.id.radio_pic:
tabHost.setCurrentTabByTag("picture");
MoveBg.moveFrontBg(img, startLeft, img.getWidth() * 2, 0, 0);
startLeft = img.getWidth() * 2;
break;
case R.id.radio_follow:
tabHost.setCurrentTabByTag("follow");
MoveBg.moveFrontBg(img, startLeft, img.getWidth() * 3, 0, 0);
startLeft = img.getWidth() * 3;
break;
case R.id.radio_vote:
tabHost.setCurrentTabByTag("vote");
MoveBg.moveFrontBg(img, startLeft, img.getWidth() * 4, 0, 0);
startLeft = img.getWidth() * 4;
break;

default:
break;
}
}
};

此處要記住移動(dòng)的初始位置和起始位置就行了。Y坐標(biāo)軸上不變,只橫向移動(dòng)。至此,這個(gè)功能實(shí)現(xiàn)完了

四、頂部按下效果實(shí)現(xiàn)

頂部和底部那個(gè)自定義控件的實(shí)現(xiàn)效果大體是一樣的,唯一不同的就是,這個(gè)移動(dòng)的不再是ImageView,而是一個(gè)TextView,在移動(dòng)完成之后還需要改變這個(gè)TextView上的文字,僅此而已,而已文件如下layout_news.xml

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

<RelativeLayout
android:id="@+id/layout_top"
android:layout_width
="match_parent"
android:layout_height
="40dip"
android:background
="#990000" >

<ImageView
android:id="@+id/img_netease_top"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerVertical
="true"
android:layout_marginLeft
="10dip"
android:src
="@drawable/netease_top" />

<TextView
android:layout_width="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerVertical
="true"
android:layout_toRightOf
="@+id/img_netease_top"
android:text
="@string/news_top_left_text"
android:textColor
="@android:color/white"
android:textSize
="20sp" />

<ImageView
android:layout_width="wrap_content"
android:layout_height
="wrap_content"
android:layout_alignParentRight
="true"
android:src
="@drawable/duoyun" />
</RelativeLayout>

<RelativeLayout
android:id="@+id/layout_title_bar"
android:layout_width
="fill_parent"
android:layout_height
="35dip"
android:background
="@android:color/white"
android:paddingLeft
="10dip"
android:paddingRight
="10dip" >

<LinearLayout
android:layout_width="fill_parent"
android:layout_height
="match_parent"
android:orientation
="horizontal" >

<RelativeLayout
android:id="@+id/layout"
android:layout_width
="match_parent"
android:layout_height
="match_parent"
android:layout_weight
="1" >

<TextView
android:id="@+id/tv_title_bar_news"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerInParent
="true"
android:text
="@string/title_news_category_tops" />
</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height
="match_parent"
android:layout_weight
="1" >

<TextView
android:id="@+id/tv_title_bar_sport"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerInParent
="true"
android:text
="@string/title_news_category_sport" />
</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height
="match_parent"
android:layout_weight
="1" >

<TextView
android:id="@+id/tv_title_bar_play"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerInParent
="true"
android:text
="@string/title_news_category_play" />
</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height
="match_parent"
android:layout_weight
="1" >

<TextView
android:id="@+id/tv_title_bar_finance"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerInParent
="true"
android:text
="@string/title_news_category_finance" />
</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height
="match_parent"
android:layout_weight
="1" >

<TextView
android:id="@+id/tv_title_bar_science"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerInParent
="true"
android:text
="@string/title_news_category_science" />
</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height
="match_parent"
android:layout_weight
="1" >

<TextView
android:id="@+id/tv_title_bar_more"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerInParent
="true"
android:text
="@string/title_news_category_more" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>

</LinearLayout>

對(duì)應(yīng)的Activity代碼TabNewsActivity.java

package com.and.netease;

import com.and.netease.utils.MoveBg;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;

public class TabNewsActivity extends Activity {
RelativeLayout layout;
TextView tv_front;//需要移動(dòng)的View

TextView tv_bar_news;
TextView tv_bar_sport;
TextView tv_bar_play;
TextView tv_bar_finance;
TextView tv_bar_science;
TextView tv_bar_more;

int avg_width = 0;// 用于記錄平均每個(gè)標(biāo)簽的寬度,移動(dòng)的時(shí)候需要

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

initViews();
}

private void initViews() {
layout = (RelativeLayout) findViewById(R.id.layout_title_bar);

tv_bar_news = (TextView) findViewById(R.id.tv_title_bar_news);
tv_bar_sport = (TextView) findViewById(R.id.tv_title_bar_sport);
tv_bar_play = (TextView) findViewById(R.id.tv_title_bar_play);
tv_bar_finance = (TextView) findViewById(R.id.tv_title_bar_finance);
tv_bar_science = (TextView) findViewById(R.id.tv_title_bar_science);
tv_bar_more = (TextView) findViewById(R.id.tv_title_bar_more);

tv_bar_news.setOnClickListener(onClickListener);
tv_bar_sport.setOnClickListener(onClickListener);
tv_bar_play.setOnClickListener(onClickListener);
tv_bar_finance.setOnClickListener(onClickListener);
tv_bar_science.setOnClickListener(onClickListener);
tv_bar_more.setOnClickListener(onClickListener);

tv_front = new TextView(this);
tv_front.setBackgroundResource(R.drawable.slidebar);
tv_front.setTextColor(Color.WHITE);
tv_front.setText("頭條");
tv_front.setGravity(Gravity.CENTER);
RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
param.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
layout.addView(tv_front, param);

}

private OnClickListener onClickListener = new OnClickListener() {
int startX;//移動(dòng)的起始位置

@Override
public void onClick(View v) {
avg_width = findViewById(R.id.layout).getWidth();
switch (v.getId()) {
case R.id.tv_title_bar_news:
MoveBg.moveFrontBg(tv_front, startX, 0, 0, 0);
startX = 0;
tv_front.setText(R.string.title_news_category_tops);
break;
case R.id.tv_title_bar_sport:
MoveBg.moveFrontBg(tv_front, startX, avg_width, 0, 0);
startX = avg_width;
tv_front.setText(R.string.title_news_category_sport);
break;
case R.id.tv_title_bar_play:
MoveBg.moveFrontBg(tv_front, startX, avg_width * 2, 0, 0);
startX = avg_width * 2;
tv_front.setText(R.string.title_news_category_play);
break;
case R.id.tv_title_bar_finance:
MoveBg.moveFrontBg(tv_front, startX, avg_width * 3, 0, 0);
startX = avg_width * 3;
tv_front.setText(R.string.title_news_category_finance);
break;
case R.id.tv_title_bar_science:
MoveBg.moveFrontBg(tv_front, startX, avg_width * 4, 0, 0);
startX = avg_width * 4;
tv_front.setText(R.string.title_news_category_science);
break;
case R.id.tv_title_bar_more:
MoveBg.moveFrontBg(tv_front, startX, avg_width * 5, 0, 0);
startX = avg_width * 5;
tv_front.setText(R.string.title_news_category_more);
break;

default:
break;
}

}
};

}

五、總結(jié)

通過(guò)這種例子,我個(gè)人總結(jié)有兩點(diǎn)需要掌握,一個(gè)是TranslateAnimation類的使用,另一個(gè)就是布局文件的嵌套使用,經(jīng)驗(yàn)多了,慢慢就會(huì)有感覺(jué)了。以上僅代表我個(gè)人的一點(diǎn)點(diǎn)想法和總結(jié),還請(qǐng)各位多多指教。(另外附上源代碼下載地址

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android 設(shè)置頁(yè)面UI設(shè)計(jì)
TabActivity的美化
Badge on Android TabHost
使用TabWidget實(shí)現(xiàn)Tab的切換
AndroidUI優(yōu)化4
Android屏幕適配方案,直接填寫設(shè)計(jì)圖上的像素尺寸即可完成適配,最大限度解決適配問(wèn)題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服