android 学习微信6.0主界面

1.android的一些资源图片位置:sdk/platforms/android-17/data/res/drawable-hdpi

2.titlebar 上显示搜索图标:android:showAsAction="ifRoom|collapseActionView"

为搜索图标添加点击事件,因搜索 item 是widget,所以要添加android:actionViewClass="android.widget.SearchView" 加载SearchView控件

但在v7上需要以下写才会显示并点击:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.z_mooc_wenxin6_0.MainActivity" >

    <item
        android:id="@+id/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/menu_search"
        android:title="@string/action_search"
        app:showAsAction="ifRoom|collapseActionView"/>

/>

跟v4的区别是多了app命名空间,自动加载资源。

3,API 14+设置actionOverflowButtonStyle(在titlebar右上角显示+号按钮)

Minimun Required SDK:API 11:android 3.0(honeycomb)因谷歌3.0更新了titlebar

如下:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">

<item name="android:actionOverflowButtonStyle">@style/weixinActionOverflowButtonStyle</item>

</style>

<style name="weixinActionOverflowButtonStyle">

<item name="android:src">@drawable/actionbar_add_icon</item>

</style>

如不显示需通过反射的方式强制显示:

private void setOverflowButtonAlways(){

ViewConfiguration config=ViewConfiguration.get(this);
Field menuKey=ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
menuKey.setAccessible(true);
menuKey.setBoolean(config, false);

}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setOverflowButtonAlways();
getActionBar().setDisplayShowHomeEnabled(false);//去掉titlebar返回图标
}

如果点击+号菜单弹出的菜单项没有图标,则需要做反射处理显示图标

/**
 * 设置menu显示icon
 */
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if(featureId==Window.FEATURE_ACTION_BAR && menu!=null){
try {
if(menu.getClass().getSimpleName().equals("MenuBuilder")){
Method m=menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return super.onMenuOpened(featureId, menu);
}

自定义底部view 布局XML引用命名空间:xmlns:hyman="http://schemas.android.com/apk/res/com.imooc.weixin" res后接应用包名,后面定义的属性就可以用了。


自定义View

package com.example.z_mooc_wenxin6_0;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
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;

public class ChangeColorIconWithText extends View {
private int mColor=0xFF45C01A;
private Bitmap mIconBitmap;
private String mText="微信";
private int mTextSize=(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics());
private Canvas mCanvas;
private Bitmap mBitmap;
private Paint mPaint;

private float mAlpha;

private Rect mIconRect;
private Rect mTextBound;

private Paint mTextPaint;

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_tab_icon:
BitmapDrawable drawable=(BitmapDrawable) a.getDrawable(attr);
mIconBitmap=drawable.getBitmap();
break;
case R.styleable.ChangeColorIconWithText_tab_color:
mColor=a.getColor(attr, 0xFF45C01A);
break;
case R.styleable.ChangeColorIconWithText_tab_text:
mText=a.getString(attr);
break;
case R.styleable.ChangeColorIconWithText_tab_text_size:
mTextSize=(int) a.getDimension(attr, (int) 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);
//icon的边长:
//view的宽度-leftpadding-rightpadding
//view的高度-toppadding-bottompadding-mTextBound.height
//去最小值:

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);
//内存去准备mBitmap,setAlpha,纯色,xfermode,图标
setupTargetBitmap(alpha);
//1.绘制文本2.绘制变色的文本
drawSourceText(canvas,alpha);
//绘制变色的文本
drawTargetText(canvas,alpha);

canvas.drawBitmap(mBitmap, 0, 0, null);
}

/**
* 绘制变色的文本
* @param mCanvas2
* @param alpha
*/
private void drawTargetText(Canvas canvas, int alpha) {
mTextPaint.setColor(mColor);
mTextPaint.setAlpha(alpha);
int x=getMeasuredWidth()/2-mTextBound.height()/2;
int y=mIconRect.bottom+mTextBound.height();
canvas.drawText(mText, x, y, mTextPaint);
}

/**
* 绘制原文本
* @param mCanvas2
* @param alpha
*/
private void drawSourceText(Canvas canvas, int alpha) {
mTextPaint.setColor(0xff333333);
mTextPaint.setAlpha(255-alpha);
int x=getMeasuredWidth()/2-mTextBound.height()/2;
int y=mIconRect.bottom+mTextBound.height();
canvas.drawText(mText, x, y, mTextPaint);
}
/**
* 在内存中绘制可变色的icon
* @param alpha
*/
private void setupTargetBitmap(int alpha) {
mBitmap=Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), 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);
}

//当进程杀死或者重绘或横竖屏切换保存原有的状态(不受oncreate()的影响)
private static final String INSTANCE_STATUS="instance_status";
private static final String STATUS_ALPHA="status_alpha";

@Override
protected Parcelable onSaveInstanceState() {
Bundle bundle=new Bundle();
bundle.putParcelable(INSTANCE_STATUS, super.onSaveInstanceState());
bundle.putFloat(STATUS_ALPHA, mAlpha);
return bundle;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
if(state instanceof Bundle){
Bundle bundle=(Bundle)state;
mAlpha=bundle.getFloat(STATUS_ALPHA);
super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATUS));
return;
}

super.onRestoreInstanceState(state);
}

public void setIconAlpha(float alpha){
this.mAlpha=alpha;
invalidateView();
}
/**
* 重绘
*/
private void invalidateView() {
if(Looper.getMainLooper()==Looper.myLooper()){
invalidate();
} else{
postInvalidate();
}
}
}

ViewPager监听事件OnPageChangeListener:

@Override
public void onPageScrollStateChanged(int arg0) {

}
//滑动显示渐变图片和字体
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
Log.e("TAG","position="+position+",positionOffset="+positionOffset);
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 arg0) {

}

总结:

@Override
public void onPageScrolled(int position, float position1, int position2) {
}
从第一页到第二页
position=0;
positionOffset 0.0~1.0
从第二页到第一页
position=0;
positionOffset 1.0~0.0

高仿微信6.0主界面
1.ActionBar
设置样式,改变overflowButtonStyle;反射,改变一些设置
2.ViewPager+Fragment
3.TabIndicator 自定义View
自定义View
1.attr.xml
2.布局文件中使用
3.构造方法中获取自定义属性
4.onMeasure
5.onDraw
xfermode的原理DST_IN


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博私信或留言,博看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博删除。 6、可私信博看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博私信或留言,博看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博删除。 6、可私信博看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博私信或留言,博看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博删除。 6、可私信博看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值