安卓Andriod使用入门(二)【高仿安卓微信6.0】
有的人一生默默无闻,有的人一生轰轰烈烈,甚至千古流芳,为什么会这样?因为默默无闻的人只是满足于现状,而不去想怎么轰轰烈烈过一生,不要求自己,去做,去行动,怎么能够成功?
wechat6Activity.java的代码:
package siso.geekworld;import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.Window;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;import viewhelper.ChangeColorIconWithText;
import viewhelper.TabFragment;public class wechat6Activity extends FragmentActivity implements View.OnClickListener,ViewPager.OnPageChangeListener{private ViewPager viewPager;private List<Fragment> mTabs = new ArrayList<>();private String[] mTitles = new String[]{"First Fragment","Second Fragment","Third Fragment","Fourth Fragment"};private FragmentPagerAdapter adapter;private List<ChangeColorIconWithText> mTabIndicators = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wechat6);setOverflowButtonAlways();getActionBar().setDisplayShowHomeEnabled(false);initView();initDatas();initEvents();viewPager.setAdapter(adapter);}//初始化所有事件private void initEvents() {viewPager.addOnPageChangeListener(this);}//初始化所有数据private void initDatas() {for(String mtitle:mTitles){TabFragment tabFragment = new TabFragment();Bundle bundle = new Bundle();bundle.putString(TabFragment.TITLE,mtitle);tabFragment.setArguments(bundle);mTabs.add(tabFragment);}adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {@Overridepublic android.support.v4.app.Fragment getItem(int position) {return mTabs.get(position);}@Overridepublic int getCount() {return mTabs.size();}};}//初始化所有viewprivate void initView() {viewPager = (ViewPager)findViewById(R.id.id_viewpager);ChangeColorIconWithText one = (ChangeColorIconWithText)findViewById(R.id.id_indicator_one);ChangeColorIconWithText two = (ChangeColorIconWithText)findViewById(R.id.id_indicator_two);ChangeColorIconWithText three = (ChangeColorIconWithText)findViewById(R.id.id_indicator_three);ChangeColorIconWithText four = (ChangeColorIconWithText)findViewById(R.id.id_indicator_four);mTabIndicators.add(one);mTabIndicators.add(two);mTabIndicators.add(three);mTabIndicators.add(four);one.setOnClickListener(this);two.setOnClickListener(this);three.setOnClickListener(this);four.setOnClickListener(this);one.setIconAlpha(1.0f);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}//应用反射改变OverflowButton的图标private void setOverflowButtonAlways(){try {ViewConfiguration config = ViewConfiguration.get(this);Field menuKey = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");menuKey.setAccessible(true);menuKey.setBoolean(config, false);} catch (Exception e) {e.printStackTrace();}}//设置menu显示icon@Overridepublic boolean onMenuOpened(int featureId, Menu menu) {if(featureId== Window.FEATURE_ACTION_BAR&&menu!=null){if(menu.getClass().getSimpleName().equals("MenuBuilder")){try {Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);method.setAccessible(true);method.invoke(menu,true);} catch (Exception e) {e.printStackTrace();}}}return super.onMenuOpened(featureId, menu);}@Overridepublic void onClick(View v) {resetOtherTabs();switch (v.getId()){case R.id.id_indicator_one:mTabIndicators.get(0).setIconAlpha(1.0f);viewPager.setCurrentItem(0,false);break;case R.id.id_indicator_two:mTabIndicators.get(1).setIconAlpha(1.0f);viewPager.setCurrentItem(1, false);break;case R .id.id_indicator_three:mTabIndicators.get(2).setIconAlpha(1.0f);viewPager.setCurrentItem(2, false);break;case R.id.id_indicator_four:mTabIndicators.get(3).setIconAlpha(1.0f);viewPager.setCurrentItem(3, false);break;}}private void resetOtherTabs() {for(int i=0;i<mTabIndicators.size();i++){mTabIndicators.get(i).setIconAlpha(0);}}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {if(positionOffset>0){ChangeColorIconWithText left = mTabIndicators.get(position);ChangeColorIconWithText right = mTabIndicators.get(position+1);left.setIconAlpha(1-positionOffset);right.setIconAlpha(positionOffset);}}@Overridepublic void onPageSelected(int position) {}@Overridepublic void onPageScrollStateChanged(int state) {}}
ChangeColorIconWithText.java代码:
package viewhelper;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Looper;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;import siso.geekworld.R;public class ChangeColorIconWithText extends View {private int mColor = 0xFF45C01A;private String mText = "微信";private Bitmap mIconBitmap;private int mTextSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,12,getResources().getDisplayMetrics());private Canvas mCanvas;private Bitmap mBitmap;private Paint mPaint;//透明度0.0~1.0private float mAlpha ;private Rect mIconRect;private Rect mTextBound;private Paint mTextPaint;private static final String INSTANCE_STATUS = "instance_status";private static final String INSTANCE_ALPHA = "instance_alpha";public ChangeColorIconWithText(Context context) {this(context, null);}public ChangeColorIconWithText(Context context, AttributeSet attrs) {this(context, attrs, 0);}/*** 获取自定义属性的值* @param context* @param attrs* @param defStyleAttr*/public ChangeColorIconWithText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ChangeColorIconWithText);int n = a.getIndexCount();for(int i=0;i<n;i++){int attr = a.getIndex(i);switch (attr){case R.styleable.ChangeColorIconWithText_micon:BitmapDrawable drawable =(BitmapDrawable)a.getDrawable(attr);mIconBitmap = drawable.getBitmap();break;case R.styleable.ChangeColorIconWithText_mcolor:mColor = a.getColor(attr,0xFF45C01A);break;case R.styleable.ChangeColorIconWithText_text:mText = a.getString(attr);break;case R.styleable.ChangeColorIconWithText_text_size:mTextSize = (int)a.getDimension(attr,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,12,getResources().getDisplayMetrics()));break;}}a.recycle();mTextBound = new Rect();mTextPaint = new Paint();mTextPaint.setTextSize(mTextSize);mTextPaint.setColor(0Xff555555);mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBound);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int iconWidth = Math.min(getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),getMeasuredHeight() - getPaddingTop() - getPaddingBottom() - mTextBound.height());int left = getMeasuredWidth()/2 - iconWidth/2;int top = getMeasuredHeight()/2-(mTextBound.height()+iconWidth)/2;mIconRect = new Rect(left,top,left+iconWidth,top+iconWidth);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(mIconBitmap, null, mIconRect, null);int alpha = (int)Math.ceil(255*mAlpha);//内存准备Bitmap,setAlpha,纯色,xfermode,图标setUpTargetBitmap(alpha);//1.绘制原文本 2.绘制变色的文本drawSourceText(canvas,alpha);drawTargetText(canvas,alpha);canvas.drawBitmap(mBitmap, 0, 0, null);}//绘制变色的文本private void drawTargetText(Canvas canvas, int alpha) {mTextPaint.setColor(mColor);mTextPaint.setAlpha(alpha);int x = mIconRect.left+mIconRect.width()/2-mTextBound.width()/2;int y = mIconRect.bottom+mTextBound.height();canvas.drawText(mText, x, y, mTextPaint);}//绘制原文本private void drawSourceText(Canvas canvas, int alpha) {mTextPaint.setColor(0xff333333);mTextPaint.setAlpha(255-alpha);int x = mIconRect.left+mIconRect.width()/2-mTextBound.width()/2;int y = mIconRect.bottom+mTextBound.height();canvas.drawText(mText, x, y, mTextPaint);}//在内存中绘制可变色的Iconprivate void setUpTargetBitmap(int alpha) {mBitmap = Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(), Bitmap.Config.ARGB_8888);mCanvas = new Canvas(mBitmap);mPaint = new Paint();mPaint.setColor(mColor);//抗锯齿mPaint.setAntiAlias(true);//抖动处理mPaint.setDither(true);mPaint.setAlpha(alpha);mCanvas.drawRect(mIconRect, mPaint);mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));mPaint.setAlpha(255);mCanvas.drawBitmap(mIconBitmap, null, mIconRect, mPaint);}public void setIconAlpha(float alpha){this.mAlpha = alpha;//重绘invalidateView();}private void invalidateView(){if(Looper.getMainLooper()==Looper.myLooper()){//是UI线程invalidate();}else{postInvalidate();}}@Overrideprotected Parcelable onSaveInstanceState() {Bundle bundle = new Bundle();bundle.putParcelable(INSTANCE_STATUS,super.onSaveInstanceState());bundle.putFloat(INSTANCE_ALPHA,mAlpha);return bundle;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {if(state instanceof Bundle){Bundle bundle = (Bundle)state;mAlpha = bundle.getFloat(INSTANCE_ALPHA);super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATUS));}else{super.onRestoreInstanceState(state);}}
}
TabFragment.java代码:
package viewhelper;import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;public class TabFragment extends android.support.v4.app.Fragment {private String mTitle = "DEFAULT";public static final String TITLE = "title";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {if(getArguments()!=null){mTitle = getArguments().getString(TITLE);}TextView tv = new TextView(getActivity());tv.setText(mTitle);tv.setTextSize(20);tv.setGravity(Gravity.CENTER);tv.setBackgroundColor(Color.parseColor("#ffffffff"));return tv;}
}
activity_wechat6.xml内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:hymen="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.view.ViewPagerandroid:id="@+id/id_viewpager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></android.support.v4.view.ViewPager><LinearLayoutandroid:orientation="horizontal"android:background="@drawable/tab_bg"android:layout_width="match_parent"android:layout_height="60dp"><viewhelper.ChangeColorIconWithTextandroid:id="@+id/id_indicator_one"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:padding="5dp"hymen:micon="@drawable/ic_menu_start_conversation"hymen:mcolor="#ff45c01a"hymen:text_size="12sp"hymen:text="@string/app_name"/><viewhelper.ChangeColorIconWithTextandroid:id="@+id/id_indicator_two"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:padding="5dp"hymen:micon="@drawable/ic_menu_friendslist"hymen:mcolor="#ff45c01a"hymen:text_size="12sp"hymen:text="@string/tab_contact"/><viewhelper.ChangeColorIconWithTextandroid:id="@+id/id_indicator_three"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:padding="5dp"hymen:mcolor="#ff45c01a"hymen:micon="@drawable/ic_menu_emoticons"hymen:text="@string/tab_found"hymen:text_size="12sp" /><viewhelper.ChangeColorIconWithTextandroid:id="@+id/id_indicator_four"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:padding="5dp"hymen:mcolor="#ff45c01a"hymen:micon="@drawable/ic_menu_allfriends"hymen:text="@string/tab_me"hymen:text_size="12sp" /></LinearLayout>
</LinearLayout>
strings.xml内容:
<resources><string name="app_name">微信</string><string name="action_search">查找</string><string name="action_add">添加</string><string name="menu_group_chat">发起群聊</string><string name="menu_feedback">意见反馈</string><string name="menu_addfriend">添加朋友</string><string name="menu_scan">扫一扫</string><string name="tab_contact">通讯录</string><string name="tab_found">发现</string><string name="tab_me">我</string></resources>
main.xml内容 :
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item
android:id="@+id/action_search"android:icon="@drawable/actionbar_search_icon"android:actionViewClass="android.widget.SearchView"android:showAsAction="ifRoom|collapseActionView"android:title="@string/action_search"/><item
android:id="@+id/action_group_chat"android:icon="@drawable/menu_group_chat_icon"android:title="@string/menu_group_chat"/><item
android:id="@+id/action_add_friend"android:icon="@drawable/menu_add_icon"android:title="@string/menu_addfriend"/><item
android:id="@+id/action_scan"android:icon="@drawable/men_scan_icon"android:title="@string/menu_scan"/><item
android:id="@+id/action_feedback"android:icon="@drawable/menu_feedback_icon"android:title="@string/menu_feedback"/>
</menu>
styles.xml内容:
<resources><!-- Base application theme. --><style name="AppBaseTheme" parent="Theme.AppCompat.Light"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:actionOverflowButtonStyle">@style/WeiXinOverflowButtonStyle</item></style><style name="WeiXinOverflowButtonStyle"><item name="android:src">@drawable/actionbar_add_icon</item></style><!-- Application theme. --><style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"><!-- <style name="AppTheme" parent="AppBaseTheme">--><!-- All customizations that are NOT specific to a particular API-level can go here. --></style>
</resources>
drawable资源:
运行结果如图:
安卓Andriod使用入门(二)【高仿安卓微信6.0】相关推荐
- iOS高仿新版微信扫一扫源码
iOS版本高仿新版微信V8.0.6扫一扫.支持全屏扫码,支持识别多个二维码,支持选择指定二维码,支持从相册选取二维码,支持光线暗打开手电筒.无需多余的文件,一个Controller即可搞定,可继承,可 ...
- progressblock 安卓自定义进度条 progressbar 高仿仿QQ下载进度条
progressblock 安卓自定义进度条 progressbar 高仿仿QQ下载进度条 附上我在公司做下载播放项目 主要使用方法 progressBlock = (ProgressBlock) f ...
- Netty入门与实战:仿写微信IM即时通讯系统
转载自:Netty入门与实战:仿写微信IM即时通讯系统 Netty是互联网中间件领域使用最广泛最核心的网络通信框架,几乎所有互联网中间件或者大数据领域均离不开Netty,掌握Netty是作为初中级工程 ...
- 苹果android怎么升级,微信系统大升级,苹果安卓手机如何升级更新为最新版微信8.0?...
原标题:微信系统大升级,苹果安卓手机如何升级更新为最新版微信8.0? 昨天,微信发布了最新版微信8.0.与以往不同的是,作为一款已风靡十年的社交产品,微信此次版本更新带来许多全新玩法和小创意. 目前苹 ...
- 苹果android怎么升级,微信系统升级!苹果安卓手机如何升级更新为最新版微信8.0?...
昨天,微信发布了最新版微信8.0.与以往不同的是,作为一款已风靡十年的社交产品,微信此次版本更新带来许多全新玩法和小创意. 目前苹果手机用户可以点击"关于微信"进行自动升级,安卓系 ...
- 安卓Andriod使用入门(八)【联动ListView】
人生最大的幸福是放得下. MainActivity.java代码: package siso.multilistview;import android.content.Intent; import a ...
- 安卓Andriod使用入门(十九)【网络视频播放器】
有时侯明白人的一生当中,深刻的思念是维系自己与记忆的纽带.它维系着所有的过往.悲喜,亦指引我们深入茫茫命途.这是我们宿命的背负.但我始终甘之如饴地承受它的沉沉重量,用以平衡轻浮的生. MainActi ...
- 安卓淘宝商店界面之高仿类CollapsinToolBar 直接搬运到项目中
先说明一下这是我下载下来的demo稍作修改的,并不是原创,找不到原文链接了,如各位朋友有发现,请回复一下链接,谢谢! OK 先上GIF看看效果 首先看看主界面: MainActivit ...
- 雨林木风高仿XP系统 3.0版下载地址
今天,Ylmf OS 3.0,或许你会眼前一亮,你会觉得它相比老版顺手很多,它是用不同的创意来诠释应用上的便利.我们对提高用户体验充满信心. 雨林木风开源操作系统一直受到全球关注,有更多的资 ...
最新文章
- 万万没想到,坤坤洗白的第一步是周琦…
- 使用PaddleFluid和TensorFlow训练RNN语言模型
- VUE-PDF VUE的PDF预览组件
- numpy保存/读取pickle
- Factorization Machine 1
- 跨服务器、跨数据库、多表联合查询
- 笔画输入法6.8豪华版 破解版
- 华为HG8120C光猫换天邑TEWA-600AGM(百兆换千兆)的过程记录
- 知其然,不知其所以然
- sumif单列求和_sumif函数使用方法:单条件求和
- js方法禁止查看源文件、防止复制、禁止右键、防被框架的方法总结
- 前端面试总结2018.07
- 台式计算机 按键盘字母键 没反应6,台式电脑键盘没反应怎么回事 键盘按了没反应怎么办...
- layer php相册层,贤心旧版jquery layer.js如何展示相册
- 用python计算邮费考虑是否加急,用python计算residuals
- hdu3491 最小点割集(无向图求最小点割集通用方法)
- 一行能装逼的JavaScript代码的延伸
- django 快速实现文件上传(django2.0)
- The supplied data appears to be in the Office 2007+ XML. You are calling the
- 华为ME60、S9306从设备观看光模块收/发光命令