总结
开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?
作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
2、CircleImageDrawable
那么下来,我们再看看自定义圆形Drawable的写法:
package com.zhy.view;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable;
public class CircleImageDrawable extends Drawable
{
private Paint mPaint;
private int mWidth;
private Bitmap mBitmap ;
public CircleImageDrawable(Bitmap bitmap)
{
mBitmap = bitmap ;
BitmapShader bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP,
TileMode.CLAMP);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setShader(bitmapShader);
mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight());
}
@Override
public void draw(Canvas canvas)
{
canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mPaint);
}
@Override
public int getIntrinsicWidth()
{
return mWidth;
}
@Override
public int getIntrinsicHeight()
{
return mWidth;
}
@Override
public void setAlpha(int alpha)
{
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf)
{
mPaint.setColorFilter(cf);
}
@Override
public int getOpacity()
{
return PixelFormat.TRANSLUCENT;
}
}
一样出奇的简单,再看一眼效果图:
ok,关于自定义Drawable的例子over~~~接下来看自定义状态的。
上述参考了:Romain Guy’s Blog
3、自定义Drawable State
===================
关于Drawable State,state_pressed神马的,相信大家都掌握的特别熟练了。
那么接下来,我们有个需求,类似于邮箱,邮件以ListView形式展示,但是我们需要一个状态去标识出未读和已读:so,我们自定义一个状态state_message_readed。
效果图:
可以看到,如果是已读的邮件,我们的图标是打开状态,且有个淡红色的背景。那么如何通过自定义drawable state 实现呢?
自定义drawable state 需要分为以下几个步骤:
1、res/values/新建一个xml文件:drawable_status.xml
<?xml version="1.0" encoding="utf-8"?>2、继承Item的容器
我们这里Item选择RelativeLayout实现,我们需要继承它,然后复写它的onCreateDrawableState方法,把我们自定义的状态在合适的时候添加进去。
package com.zhy.view;
import com.zhy.sample.drawable.R;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
public class MessageListItem extends RelativeLayout
{
private static final int[] STATE_MESSAGE_READED = { R.attr.state_message_readed };
private boolean mMessgeReaded = false;
public MessageListItem(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public void setMessageReaded(boolean readed)
{
if (this.mMessgeReaded != readed)
{
mMessgeReaded = readed;
refreshDrawableState();
}
}
@Override
protected int[] onCreateDrawableState(int extraSpace)
{
if (mMessgeReaded)
{
final int[] drawableState = super
.onCreateDrawableState(extraSpace + 1);
mergeDrawableStates(drawableState, STATE_MESSAGE_READED);
return drawableState;
}
return super.onCreateDrawableState(extraSpace);
}
}
代码不复杂,声明了一个STATE_MESSAGE_READED,然后在mMessgeReaded=true的情况下,通过onCreateDrawableState方法,加入我们自定义的状态。
类似的代码,大家可以看看CompoundButton(CheckBox父类)的源码,它有个checked状态:
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
3、使用
布局文件:
<com.zhy.view.MessageListItem xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“50dp”
android:background=“@drawable/message_item_bg” >
<ImageView
android:id=“@+id/id_msg_item_icon”
android:layout_width=“30dp”
android:src=“@drawable/message_item_icon_bg”
android:layout_height=“wrap_content”
android:duplicateParentState=“true”
android:layout_alignParentLeft=“true”
android:layout_centerVertical=“true”
/>
<TextView
android:id=“@+id/id_msg_item_text”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_centerVertical=“true”
android:layout_toRightOf=“@id/id_msg_item_icon” />
</com.zhy.view.MessageListItem>
很简单,一个图标,一个文本;
Activity
package com.zhy.sample.drawable;
import com.zhy.view.MessageListItem;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class CustomStateActivity extends ListActivity
{
private Message[] messages = new Message[] {
new Message(“Gas bill overdue”, true),
new Message(“Congratulations, you’ve won!”, true),
new Message(“I love you!”, false),
new Message(“Please reply!”, false),
new Message(“You ignoring me?”, false),
new Message(“Not heard from you”, false),
new Message(“Electricity bill”, true),
new Message(“Gas bill”, true), new Message(“Holiday plans”, false),
new Message(“Marketing stuff”, false), };
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getListView().setAdapter(new ArrayAdapter(this, -1, messages)
{
private LayoutInflater mInflater = LayoutInflater
.from(getContext());
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.item_msg_list,
parent, false);
}
MessageListItem messageListItem = (MessageListItem) convertView;
TextView tv = (TextView) convertView
.findViewById(R.id.id_msg_item_text);
tv.setText(getItem(position).message);
messageListItem.setMessageReaded(getItem(position).readed);
return convertView;
}
});
}
}
代码很简单,但是可以看到,我们需要在getView里面中去使用调用setMessageReaded方法,当然了其他的一些状态,肯定也要手动触发,比如在ACTION_DOWN中触发pressed等。请勿纠结咋没有使用ViewHolder什么的,自己添加下就行。
本例参考自:Example from github
4、提升我们的UI Perfermance
======================
现在大家越来越注重性能问题,其实没必要那么在乎,但是既然大家在乎了,这里通过Cyril Mottier :master_android_drawables ppt中的一个例子来说明如果利用Drawable来提升我们的UI的性能。
大家看这样一个效果图:
布局文件:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:background=“@color/app_background”
android:padding=“8dp” >
<ImageView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginBottom=“24dp”
android:src=“@drawable/logo” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“48dp”
android:layout_gravity=“bottom”
android:orientation=“horizontal” >
<Button
android:layout_width=“0dp”
android:layout_height=“fill_parent”
android:layout_weight=“1”
android:text=“@string/sign_up” />
<Button
android:layout_width=“0dp”
android:layout_height=“fill_parent”
android:layout_weight=“1”
android:text=“@string/sign_in” />
学习交流
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
/>
<Button
android:layout_width=“0dp”
android:layout_height=“fill_parent”
android:layout_weight=“1”
android:text=“@string/sign_in” />
学习交流
[外链图片转存中…(img-SpV9uvC7-1715600861640)]
[外链图片转存中…(img-Q0gpUwXX-1715600861640)]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!