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) {
}
总结: