Android学习教程之高仿安卓微信6.0(2)
程序员文章站
2024-03-01 19:29:04
本文实例为大家分享了android仿安卓微信6.0的具体代码,供大家参考,具体内容如下
wechat6activity.java的代码:
package sis...
本文实例为大家分享了android仿安卓微信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<>(); @override protected 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()) { @override public android.support.v4.app.fragment getitem(int position) { return mtabs.get(position); } @override public int getcount() { return mtabs.size(); } }; } //初始化所有view private 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); } @override public 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 @override public 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); } @override public 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); } } @override public 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); } } @override public void onpageselected(int position) { } @override public 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.0 private 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); } @override protected 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); } @override protected 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); } //在内存中绘制可变色的icon private 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(); } } @override protected parcelable onsaveinstancestate() { bundle bundle = new bundle(); bundle.putparcelable(instance_status,super.onsaveinstancestate()); bundle.putfloat(instance_alpha,malpha); return bundle; } @override protected 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"; @override public 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.viewpager android:id="@+id/id_viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.viewpager> <linearlayout android:orientation="horizontal" android:background="@drawable/tab_bg" android:layout_width="match_parent" android:layout_height="60dp"> <viewhelper.changecoloriconwithtext android: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.changecoloriconwithtext android: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.changecoloriconwithtext android: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.changecoloriconwithtext android: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资源:
运行结果如图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: pygame 精灵的行走及二段跳的实现方法(必看篇)
下一篇: Java中实现简单的Excel导出