Android的加载动画AVLoadingIndicatorView
项目地址:
https://github.com/81813780/AVLoadingIndicatorView
首先,在 build.gradle.中添加;
dependencies {
compile 'com.wang.avi:library:2.1.3'
}
然后在xml中使用;
<com.wang.avi.AVLoadingIndicatorView
android:id="@+id/avi"
android:layout_width="wrap_content" //or your custom size
android:layout_height="wrap_content" //or your custom size
style="@style/AVLoadingIndicatorView"// or AVLoadingIndicatorView.Large or
AVLoadingIndicatorView.Small
android:visibility="visible" //visible or gone
app:indicatorName="BallPulseIndicator"//Indicator Name
app:indicatorColor="your color"
/>
也可以通过代码显示或者隐藏;
void startAnim(){
avi.show();
// or avi.smoothToShow();
}
void stopAnim(){
avi.hide();
// or avi.smoothToHide();
}
QuantityView 类似购物车数量调节:
效果图:
项目在GitHub上的地址:
https://github.com/himanshu-soni/QuantityView
项目使用:
在gradle中添加
compile 'me.himanshusoni.quantityview:quantity-view:1.1.3'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/md_white_1000"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Default"
android:textAppearance="?android:textAppearanceLarge" />
<me.himanshusoni.quantityview.QuantityView
android:id="@+id/quantityView_default"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:qv_quantity="10" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Custom 1"
android:textAppearance="?android:textAppearanceLarge" />
<me.himanshusoni.quantityview.QuantityView
android:id="@+id/quantityView_custom_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:qv_addButtonText="ADD MORE"
app:qv_addButtonTextColor="@color/md_green_500"
app:qv_maxQuantity="20"
app:qv_quantity="15"
app:qv_removeButtonText="REMOVE"
app:qv_removeButtonTextColor="@color/md_red_500" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Custom 2"
android:textAppearance="?android:textAppearanceLarge" />
<me.himanshusoni.quantityview.QuantityView
android:id="@+id/quantityView_custom_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:qv_addButtonBackground="@drawable/add_selector"
app:qv_addButtonTextColor="@color/md_white_1000"
app:qv_quantity="20"
app:qv_removeButtonBackground="@drawable/remove_selector"
app:qv_removeButtonTextColor="@color/md_white_1000" />
</LinearLayout>
Java中的使用代码:
public class SlideDateTimeActivity extends FragmentActivity {
@Bind(R.id.button)
Button button;
private SimpleDateFormat mFormatter = new SimpleDateFormat("MMMM dd yyyy hh:mm aa");
private Button mButton;
private SlideDateTimeListener listener = new SlideDateTimeListener() {
@Override
public void onDateTimeSet(Date date) {
Toast.makeText(SlideDateTimeActivity.this,
mFormatter.format(date), Toast.LENGTH_SHORT).show();
}
// Optional cancel listener
@Override
public void onDateTimeCancel() {
Toast.makeText(SlideDateTimeActivity.this,
"Canceled", Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_slide_date_time_picker);
ButterKnife.bind(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new SlideDateTimePicker.Builder(getSupportFragmentManager())
.setListener(listener)
.setInitialDate(new Date())
//.setMinDate(minDate)
//.setMaxDate(maxDate)
//.setIs24HourTime(true)
//.setTheme(SlideDateTimePicker.HOLO_DARK)
//.setIndicatorColor(Color.parseColor("#990000"))
.build()
.show();
}
});
}
}
Justified 实现Textview和Edittext文字左右对齐。
效果图:
项目在GitHub上的地址:
https://github.com/programingjd/justified
项目使用:
在gradle中添加
compile 'com.uncopt:android.justified:1.0'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zerom.mtest.Justifiedtextview">
<me.biubiubiu.justifytext.library.JustifyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_20"
android:text="预览版目前已经包括Android Wear最新API,这些新API可以让开发者以语音的方式定制和扩展他们的通知。其提供的仿真器可用于预览包括方形和圆形可穿戴设备上出现的通知方式,与此同时,谷歌也希望在未来几个月内继续为Android Wear设备提供新的API和功能。" />
<me.biubiubiu.justifytext.library.JustifyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_20"
android:text="Tests whether this string matches the given regularExpression. This method returns true only if the regular expression matches the entire input string. A common mistake is to assume that this method behaves like contains(CharSequence); if you want to match anywhere within the input string, you need to add .* to the beginning and end of your regular expression. See matches(String, CharSequence)." />
</LinearLayout>
android-shapeLoadingView实现高仿新版58 加载动画
效果图:
项目在GitHub上的地址:
https://github.com/zzz40500/android-shapeLoadingView
项目使用:
在gradle中添加
compile 'com.github.zzz40500:android-shapeLoadingView:1.0.3.2'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ShapeLoadingctivity">
<com.mingle.widget.LoadingView
android:id="@+id/loadView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
app:loadingText="加载中..." />
</RelativeLayout>
SlideDateTimePicker实现时间选择器,可以选择年月日小时分钟
效果图:
项目在GitHub上的地址:
https://github.com/jjobes/SlideDateTimePicker
项目使用:
添加依赖包;
Java中的使用代码:
public class SlideDateTimeActivity extends FragmentActivity {
@Bind(R.id.button)
Button button;
private SimpleDateFormat mFormatter = new SimpleDateFormat("MMMM dd yyyy hh:mm aa");
private Button mButton;
private SlideDateTimeListener listener = new SlideDateTimeListener() {
@Override
public void onDateTimeSet(Date date) {
Toast.makeText(SlideDateTimeActivity.this,
mFormatter.format(date), Toast.LENGTH_SHORT).show();
}
// Optional cancel listener
@Override
public void onDateTimeCancel() {
Toast.makeText(SlideDateTimeActivity.this,
"Canceled", Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_slide_date_time_picker);
ButterKnife.bind(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new SlideDateTimePicker.Builder(getSupportFragmentManager())
.setListener(listener)
.setInitialDate(new Date())
//.setMinDate(minDate)
//.setMaxDate(maxDate)
//.setIs24HourTime(true)
//.setTheme(SlideDateTimePicker.HOLO_DARK)
//.setIndicatorColor(Color.parseColor("#990000"))
.build()
.show();
}
});
}
}
Labelview实现标签功能,在控件上面展示斜的文字
效果图:
项目在GitHub上的地址:
https://github.com/linger1216//labelview
项目使用:
在gradle中添加
compile 'com.github.linger1216:labelview:v1.1.0'
在XML中添加布局:
<ScrollView 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<com.lid.lib.LabelButtonView
android:id="@+id/labelbutton"
android:layout_width="200dp"
android:layout_height="48dp"
android:background="#03a9f4"
android:gravity="center"
android:text="Button"
android:textColor="#ffffff"
app:label_backgroundColor="#C2185B"
app:label_distance="20dp"
app:label_height="20dp"
app:label_orientation="RIGHT_TOP"
app:label_text="HD"
app:label_textSize="12sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp">
<com.lid.lib.LabelImageView
android:id="@+id/image1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="centerCrop"
android:src="@mipmap/image1"
app:label_backgroundColor="#C2185B"
app:label_orientation="LEFT_TOP"
app:label_text="CHINA" />
<com.lid.lib.LabelImageView
android:id="@+id/image2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="centerCrop"
android:src="@mipmap/image2"
app:label_backgroundColor="#C2185B"
app:label_orientation="RIGHT_TOP"
app:label_text="KUNQU" />
</LinearLayout>
<com.lid.lib.LabelTextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:background="#212121"
android:gravity="center"
android:padding="16dp"
android:text="TextView"
android:textColor="#ffffff"
app:label_backgroundColor="#03A9F4"
app:label_distance="15dp"
app:label_orientation="LEFT_TOP"
app:label_text="POP"
app:label_textSize="10sp" />
<com.lid.lib.LabelButtonView
android:id="@+id/click"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:background="#E91E63"
android:gravity="center"
android:text="ListView demo"
android:textColor="#ffffff"
app:label_backgroundColor="#03A9F4"
app:label_distance="15dp"
app:label_orientation="RIGHT_TOP"
app:label_text="click"
app:label_textSize="10sp" />
<com.lid.lib.LabelButtonView
android:id="@+id/click11"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:background="#E91E63"
android:gravity="center"
android:text="recyclerview demo"
android:textColor="#ffffff"
app:label_backgroundColor="#03A9F4"
app:label_distance="15dp"
app:label_orientation="RIGHT_TOP"
app:label_text="click"
app:label_textSize="10sp" />
</LinearLayout>
</ScrollView>
PullZoomView实现类似微信,下拉listview,顶部图片放大效果
项目在GitHub上的地址:
https://github.com/Frank-Zhu/PullZoomView
项目使用:
在gradle中添加
compile 'com.github.frank-zhu:pullzoomview:1.0.0'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.zerom.mtest.parallaxListView.ParallaxScollListView
android:id="@+id/layout_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@null"
android:duplicateParentState="true"
android:scrollingCache="false"
android:headerDividersEnabled="false"
android:footerDividersEnabled="false"
android:overScrollMode="never"
android:scrollbars="none"
/>
</RelativeLayout>
Java中的代码:
ParallaxScollListView.class
public class ParallaxScollListView extends ListView implements AbsListView.OnScrollListener {
public final static double NO_ZOOM = 1;
public final static double ZOOM_X2 = 2;
private ImageView mImageView;
private int mDrawableMaxHeight = -1;
private int mImageViewHeight = -1;
private int mDefaultImageViewHeight = 0;
private double mZoomRatio;
private interface OnOverScrollByListener {
public boolean overScrollBy(int deltaX, int deltaY, int scrollX,
int scrollY, int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent);
}
private interface OnTouchEventListener {
public void onTouchEvent(MotionEvent ev);
}
public ParallaxScollListView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public ParallaxScollListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ParallaxScollListView(Context context) {
super(context);
init(context);
}
public void init(Context context) {
mDefaultImageViewHeight = context.getResources().getDimensionPixelSize(R.dimen.size_default_height);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
initViewsBounds(mZoomRatio);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
int scrollY, int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
boolean isCollapseAnimation = false;
isCollapseAnimation = scrollByListener.overScrollBy(deltaX, deltaY,
scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX,
maxOverScrollY, isTouchEvent)
|| isCollapseAnimation;
return isCollapseAnimation || super.overScrollBy(deltaX, deltaY,
scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX,
maxOverScrollY, isTouchEvent);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
View firstView = (View) mImageView.getParent();
// firstView.getTop < getPaddingTop means mImageView will be covered by top padding,
// so we can layout it to make it shorter
if (firstView.getTop() < getPaddingTop() && mImageView.getHeight() > mImageViewHeight) {
mImageView.getLayoutParams().height = Math.max(mImageView.getHeight() - (getPaddingTop() - firstView.getTop()), mImageViewHeight);
// to set the firstView.mTop to 0,
// maybe use View.setTop() is more easy, but it just support from Android 3.0 (API 11)
firstView.layout(firstView.getLeft(), 0, firstView.getRight(), firstView.getHeight());
mImageView.requestLayout();
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
touchListener.onTouchEvent(ev);
return super.onTouchEvent(ev);
}
public void setParallaxImageView(ImageView iv) {
mImageView = iv;
mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
private void initViewsBounds(double zoomRatio) {
if (mImageViewHeight == -1) {
mImageViewHeight = mImageView.getHeight();
if (mImageViewHeight <= 0) {
mImageViewHeight = mDefaultImageViewHeight;
}
double ratio = ((double) mImageView.getDrawable().getIntrinsicWidth()) / ((double) mImageView.getWidth());
mDrawableMaxHeight = (int) ((mImageView.getDrawable().getIntrinsicHeight() / ratio) * (zoomRatio > 1 ?
zoomRatio : 1));
}
}
public void setZoomRatio(double zoomRatio) {
mZoomRatio = zoomRatio;
}
private OnOverScrollByListener scrollByListener = new OnOverScrollByListener() {
@Override
public boolean overScrollBy(int deltaX, int deltaY, int scrollX,
int scrollY, int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
if (mImageView.getHeight() <= mDrawableMaxHeight && isTouchEvent) {
if (deltaY < 0) {
if (mImageView.getHeight() - deltaY / 2 >= mImageViewHeight) {
mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY / 2 < mDrawableMaxHeight ?
mImageView.getHeight() - deltaY / 2 : mDrawableMaxHeight;
mImageView.requestLayout();
}
} else {
if (mImageView.getHeight() > mImageViewHeight) {
mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY > mImageViewHeight ?
mImageView.getHeight() - deltaY : mImageViewHeight;
mImageView.requestLayout();
return true;
}
}
}
return false;
}
};
private OnTouchEventListener touchListener = new OnTouchEventListener() {
@Override
public void onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
if (mImageViewHeight - 1 < mImageView.getHeight()) {
ResetAnimimation animation = new ResetAnimimation(
mImageView, mImageViewHeight);
animation.setDuration(300);
mImageView.startAnimation(animation);
}
}
}
};
public class ResetAnimimation extends Animation {
int targetHeight;
int originalHeight;
int extraHeight;
View mView;
protected ResetAnimimation(View view, int targetHeight) {
this.mView = view;
this.targetHeight = targetHeight;
originalHeight = view.getHeight();
extraHeight = this.targetHeight - originalHeight;
}
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
int newHeight;
newHeight = (int) (targetHeight - extraHeight * (1 - interpolatedTime));
mView.getLayoutParams().height = newHeight;
mView.requestLayout();
}
}
}
ParallaxListViewActivity.class
public class ParallaxListViewActivity extends AppCompatActivity {
@Bind(R.id.layout_listview)
ParallaxScollListView layoutListview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parallax_list_view);
ButterKnife.bind(this);
View header = LayoutInflater.from(this).inflate(R.layout.listview_header, null);
ImageView mImageView = (ImageView) header.findViewById(R.id.layout_header_image);
layoutListview.setZoomRatio(ParallaxScollListView.ZOOM_X2);
layoutListview.setParallaxImageView(mImageView);
layoutListview.addHeaderView(header);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1,
new String[]{
"First Item",
"Second Item",
"Third Item",
"Fifth Item",
"Sixth Item",
"Seventh Item",
"Eighth Item",
"Ninth Item",
"Tenth Item",
"....."
}
);
layoutListview.setAdapter(adapter);
}
}
SwipeMenuListView实现listview滑动删除。
效果图:
项目在GitHub上的地址:
https://github.com/baoyongzhang/SwipeMenuListView
项目使用:
在gradle中添加
compile 'com.baoyz.swipemenulistview:library:1.3.0'
有两种侧滑删除的列表,一种是侧滑内容都一样的列表,SimpleActivity.class;
另一种是侧滑内容不一样的列表,DifferentMenuActivity.class;
SimpleActivity.class
public class SimpleActivity extends AppCompatActivity {
private List<ApplicationInfo> mAppList;
private AppAdapter mAdapter;
private SwipeMenuListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple);
mAppList = getPackageManager().getInstalledApplications(0);
mListView = (SwipeMenuListView) findViewById(R.id.listView);
mAdapter = new AppAdapter();
mListView.setAdapter(mAdapter);
// step 1. create a MenuCreator
SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
// create "open" item
SwipeMenuItem openItem = new SwipeMenuItem(
getApplicationContext());
// set item background
openItem.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,
0xCE)));
// set item width
openItem.setWidth(dp2px(90));
// set item title
openItem.setTitle("Open");
// set item title fontsize
openItem.setTitleSize(18);
// set item title font color
openItem.setTitleColor(Color.WHITE);
// add to menu
menu.addMenuItem(openItem);
// create "delete" item
SwipeMenuItem deleteItem = new SwipeMenuItem(
getApplicationContext());
// set item background
deleteItem.setBackground(new ColorDrawable(Color.rgb(0xF9,
0x3F, 0x25)));
// set item width
deleteItem.setWidth(dp2px(90));
// set a icon
deleteItem.setIcon(R.mipmap.ic_delete);
// add to menu
menu.addMenuItem(deleteItem);
}
};
// set creator
mListView.setMenuCreator(creator);
// step 2. listener item click event
mListView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
ApplicationInfo item = mAppList.get(position);
switch (index) {
case 0:
// open
open(item);
break;
case 1:
// delete
// delete(item);
mAppList.remove(position);
mAdapter.notifyDataSetChanged();
break;
}
return false;
}
});
// set SwipeListener
mListView.setOnSwipeListener(new SwipeMenuListView.OnSwipeListener() {
@Override
public void onSwipeStart(int position) {
// swipe start
}
@Override
public void onSwipeEnd(int position) {
// swipe end
}
});
// set MenuStateChangeListener
mListView.setOnMenuStateChangeListener(new SwipeMenuListView.OnMenuStateChangeListener() {
@Override
public void onMenuOpen(int position) {
}
@Override
public void onMenuClose(int position) {
}
});
// other setting
// listView.setCloseInterpolator(new BounceInterpolator());
// test item long click
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), position + " long click", Toast.LENGTH_SHORT).show();
return false;
}
});
}
private void delete(ApplicationInfo item) {
// delete app
try {
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.fromParts("package", item.packageName, null));
startActivity(intent);
} catch (Exception e) {
}
}
private void open(ApplicationInfo item) {
// open app
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(item.packageName);
List<ResolveInfo> resolveInfoList = getPackageManager()
.queryIntentActivities(resolveIntent, 0);
if (resolveInfoList != null && resolveInfoList.size() > 0) {
ResolveInfo resolveInfo = resolveInfoList.get(0);
String activityPackageName = resolveInfo.activityInfo.packageName;
String className = resolveInfo.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName componentName = new ComponentName(
activityPackageName, className);
intent.setComponent(componentName);
startActivity(intent);
}
}
class AppAdapter extends BaseAdapter {
@Override
public int getCount() {
return mAppList.size();
}
@Override
public ApplicationInfo getItem(int position) {
return mAppList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),
R.layout.item_list_app, null);
new ViewHolder(convertView);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
ApplicationInfo item = getItem(position);
holder.iv_icon.setImageDrawable(item.loadIcon(getPackageManager()));
holder.tv_name.setText(item.loadLabel(getPackageManager()));
holder.iv_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SimpleActivity.this, "iv_icon_click", Toast.LENGTH_SHORT).show();
}
});
holder.tv_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SimpleActivity.this,"iv_icon_click",Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
class ViewHolder {
ImageView iv_icon;
TextView tv_name;
public ViewHolder(View view) {
iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
tv_name = (TextView) view.findViewById(R.id.tv_name);
view.setTag(this);
}
}
}
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics());
}
}
DifferentMenuActivity.class
public class DifferentMenuActivity extends AppCompatActivity {
private List<ApplicationInfo> mAppList;
private AppAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple);
mAppList = getPackageManager().getInstalledApplications(0);
SwipeMenuListView listView = (SwipeMenuListView) findViewById(R.id.listView);
mAdapter = new AppAdapter();
listView.setAdapter(mAdapter);
// step 1. create a MenuCreator
SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
// Create different menus depending on the view type
switch (menu.getViewType()) {
case 0:
createMenu1(menu);
break;
case 1:
createMenu2(menu);
break;
case 2:
createMenu3(menu);
break;
}
}
private void createMenu1(SwipeMenu menu) {
SwipeMenuItem item1 = new SwipeMenuItem(
getApplicationContext());
item1.setBackground(new ColorDrawable(Color.rgb(0xE5, 0x18,
0x5E)));
item1.setWidth(dp2px(90));
item1.setIcon(R.mipmap.ic_action_favorite);
menu.addMenuItem(item1);
SwipeMenuItem item2 = new SwipeMenuItem(
getApplicationContext());
item2.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,
0xCE)));
item2.setWidth(dp2px(90));
item2.setIcon(R.mipmap.ic_action_good);
menu.addMenuItem(item2);
}
private void createMenu2(SwipeMenu menu) {
SwipeMenuItem item1 = new SwipeMenuItem(
getApplicationContext());
item1.setBackground(new ColorDrawable(Color.rgb(0xE5, 0xE0,
0x3F)));
item1.setWidth(dp2px(90));
item1.setIcon(R.mipmap.ic_action_important);
menu.addMenuItem(item1);
SwipeMenuItem item2 = new SwipeMenuItem(
getApplicationContext());
item2.setBackground(new ColorDrawable(Color.rgb(0xF9,
0x3F, 0x25)));
item2.setWidth(dp2px(90));
item2.setIcon(R.mipmap.ic_action_discard);
menu.addMenuItem(item2);
}
private void createMenu3(SwipeMenu menu) {
SwipeMenuItem item1 = new SwipeMenuItem(
getApplicationContext());
item1.setBackground(new ColorDrawable(Color.rgb(0x30, 0xB1,
0xF5)));
item1.setWidth(dp2px(90));
item1.setIcon(R.mipmap.ic_action_about);
menu.addMenuItem(item1);
SwipeMenuItem item2 = new SwipeMenuItem(
getApplicationContext());
item2.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,
0xCE)));
item2.setWidth(dp2px(90));
item2.setIcon(R.mipmap.ic_action_share);
menu.addMenuItem(item2);
}
};
// set creator
listView.setMenuCreator(creator);
// step 2. listener item click event
listView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
ApplicationInfo item = mAppList.get(position);
switch (index) {
case 0:
// open
break;
case 1:
// delete
// delete(item);
mAppList.remove(position);
mAdapter.notifyDataSetChanged();
break;
}
return false;
}
});
}
class AppAdapter extends BaseAdapter {
@Override
public int getCount() {
return mAppList.size();
}
@Override
public ApplicationInfo getItem(int position) {
return mAppList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
// menu type count
return 3;
}
@Override
public int getItemViewType(int position) {
// current menu type
return position % 3;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),
R.layout.item_list_app, null);
new ViewHolder(convertView);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
ApplicationInfo item = getItem(position);
holder.iv_icon.setImageDrawable(item.loadIcon(getPackageManager()));
holder.tv_name.setText(item.loadLabel(getPackageManager()));
return convertView;
}
class ViewHolder {
ImageView iv_icon;
TextView tv_name;
public ViewHolder(View view) {
iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
tv_name = (TextView) view.findViewById(R.id.tv_name);
view.setTag(this);
}
}
}
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics());
}
}
gif-movie-view实现播放gif图像
项目在GitHub上的地址:
https://github.com/sbakhtiarov/gif-movie-view
项目使用:
自定义View:
GifMovieView.class
public class GifMovieView extends View {
private static final int DEFAULT_MOVIEW_DURATION = 1000;
private int mMovieResourceId;
private Movie mMovie;
private long mMovieStart;
private int mCurrentAnimationTime = 0;
/**
* Position for drawing animation frames in the center of the view.
*/
private float mLeft;
private float mTop;
/**
* Scaling factor to fit the animation within view bounds.
*/
private float mScale;
/**
* Scaled movie frames width and height.
*/
private int mMeasuredMovieWidth;
private int mMeasuredMovieHeight;
private volatile boolean mPaused = false;
private boolean mVisible = true;
public GifMovieView(Context context) {
this(context, null);
}
public GifMovieView(Context context, AttributeSet attrs) {
this(context, attrs, R.styleable.CustomTheme_gifMoviewViewStyle);
}
public GifMovieView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setViewAttributes(context, attrs, defStyle);
}
private void setViewAttributes(Context context, AttributeSet attrs, int defStyle) {
/**
* Starting from HONEYCOMB have to turn off HW acceleration to draw
* Movie on Canvas.
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GifMoviewView, defStyle,
R.style.Widget_GifMoviewView);
mMovieResourceId = array.getResourceId(R.styleable.GifMoviewView_gif, -1);
mPaused = array.getBoolean(R.styleable.GifMoviewView_paused, false);
array.recycle();
if (mMovieResourceId != -1) {
mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
}
}
public void setMovieResource(int movieResId) {
this.mMovieResourceId = movieResId;
mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
requestLayout();
}
public void setMovie(Movie movie) {
this.mMovie = movie;
requestLayout();
}
public Movie getMovie() {
return mMovie;
}
public void setMovieTime(int time) {
mCurrentAnimationTime = time;
invalidate();
}
public void setPaused(boolean paused) {
this.mPaused = paused;
/**
* Calculate new movie start time, so that it resumes from the same
* frame.
*/
if (!paused) {
mMovieStart = android.os.SystemClock.uptimeMillis() - mCurrentAnimationTime;
}
invalidate();
}
public boolean isPaused() {
return this.mPaused;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mMovie != null) {
int movieWidth = mMovie.width();
int movieHeight = mMovie.height();
/*
* Calculate horizontal scaling
*/
float scaleH = 1f;
int measureModeWidth = MeasureSpec.getMode(widthMeasureSpec);
if (measureModeWidth != MeasureSpec.UNSPECIFIED) {
int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);
if (movieWidth > maximumWidth) {
scaleH = (float) movieWidth / (float) maximumWidth;
}
}
/*
* calculate vertical scaling
*/
float scaleW = 1f;
int measureModeHeight = MeasureSpec.getMode(heightMeasureSpec);
if (measureModeHeight != MeasureSpec.UNSPECIFIED) {
int maximumHeight = MeasureSpec.getSize(heightMeasureSpec);
if (movieHeight > maximumHeight) {
scaleW = (float) movieHeight / (float) maximumHeight;
}
}
/*
* calculate overall scale
*/
mScale = 1f / Math.max(scaleH, scaleW);
mMeasuredMovieWidth = (int) (movieWidth * mScale);
mMeasuredMovieHeight = (int) (movieHeight * mScale);
setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight);
} else {
/*
* No movie set, just set minimum available size.
*/
setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
/*
* Calculate left / top for drawing in center
*/
mLeft = (getWidth() - mMeasuredMovieWidth) / 2f;
mTop = (getHeight() - mMeasuredMovieHeight) / 2f;
mVisible = getVisibility() == View.VISIBLE;
}
@Override
protected void onDraw(Canvas canvas) {
if (mMovie != null) {
if (!mPaused) {
updateAnimationTime();
drawMovieFrame(canvas);
invalidateView();
} else {
drawMovieFrame(canvas);
}
}
}
/**
* Invalidates view only if it is visible.
* <br>
* {@link #postInvalidateOnAnimation()} is used for Jelly Bean and higher.
*
*/
private void invalidateView() {
if(mVisible) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
postInvalidateOnAnimation();
} else {
invalidate();
}
}
}
/**
* Calculate current animation time
*/
private void updateAnimationTime() {
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) {
mMovieStart = now;
}
int dur = mMovie.duration();
if (dur == 0) {
dur = DEFAULT_MOVIEW_DURATION;
}
mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
}
/**
* Draw current GIF frame
*/
private void drawMovieFrame(Canvas canvas) {
mMovie.setTime(mCurrentAnimationTime);
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.scale(mScale, mScale);
mMovie.draw(canvas, mLeft / mScale, mTop / mScale);
canvas.restore();
}
@Override
public void onScreenStateChanged(int screenState) {
super.onScreenStateChanged(screenState);
mVisible = screenState == SCREEN_STATE_ON;
invalidateView();
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
mVisible = visibility == View.VISIBLE;
invalidateView();
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
mVisible = visibility == View.VISIBLE;
invalidateView();
}
}
XML中的布局:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFFFF"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.zerom.mtest.GifMove.GifMovieView
android:id="@+id/gif1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onGifClick" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<com.zerom.mtest.GifMove.GifMovieView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onGifClick"
custom:gif="@mipmap/gif_heart" />
<com.zerom.mtest.GifMove.GifMovieView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onGifClick"
custom:gif="@mipmap/gif_heart" />
<com.zerom.mtest.GifMove.GifMovieView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onGifClick"
custom:gif="@mipmap/gif_heart" />
<com.zerom.mtest.GifMove.GifMovieView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onGifClick"
custom:gif="@mipmap/gif_heart" />
</LinearLayout>
</LinearLayout>
</ScrollView>
Activity中使用:
public class GifMoveActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gif_move);
final GifMovieView gif1 = (GifMovieView) findViewById(R.id.gif1);
assert gif1 != null;
gif1.setMovieResource(R.mipmap.gif_heart);
}
public void onGifClick(View v) {
GifMovieView gif = (GifMovieView) v;
gif.setPaused(!gif.isPaused());
}
}
BubbleView实现类似聊天气泡的view
效果图:
项目使用:
在gradle中添加
compile 'com.lguipeng.bubbleview:library:1.0.0'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:divider="@drawable/divider"
android:gravity="center_horizontal"
android:orientation="vertical"
android:showDividers="middle">
<com.github.library.bubbleview.BubbleTextVew
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Hello BubbleTextVew"
android:textColor="@android:color/white"
android:textSize="20sp"
app:angle="8dp"
app:arrowHeight="10dp"
app:arrowLocation="right"
app:arrowPosition="14dp"
app:arrowWidth="8dp"
app:bubbleColor="#7EC0EE" />
<com.github.library.bubbleview.BubbleImageView
android:id="@+id/bubble_image"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:src="@drawable/girl"
app:angle="6dp"
app:arrowHeight="8dp"
app:arrowLocation="top"
app:arrowPosition="15dp"
app:arrowWidth="10dp" />
<com.github.library.bubbleview.BubbleLinearLayout
android:id="@+id/bubble_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:angle="4dp"
app:arrowHeight="10dp"
app:arrowLocation="left"
app:arrowPosition="10dp"
app:arrowWidth="8dp"
app:bubbleColor="#7EC0EE">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:src="@mipmap/ic_launcher" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="4dp"
android:text="BubbleLinearLayout Text"
android:textColor="@android:color/white" />
</com.github.library.bubbleview.BubbleLinearLayout>
<com.github.library.bubbleview.BubbleTextVew
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Hello BubbleTextVew"
android:textColor="@android:color/white"
app:angle="2dp"
app:arrowHeight="10dp"
app:arrowLocation="bottom"
app:arrowPosition="10dp"
app:arrowWidth="8dp"
app:bubbleColor="#ff4444" />
</LinearLayout>
MaterialFavoriteButton收藏与取消收藏
效果图:
项目在GitHub上的地址:
https://github.com/IvBaranov/MaterialFavoriteButton
项目使用:
在gradle中添加
compile 'com.github.ivbaranov:materialfavoritebutton:0.1.2'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MaterialFavoriteButtonActivity">
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
</android.support.design.widget.CoordinatorLayout>
content_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/card_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_padding"
android:text="Basic"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_padding"
android:text="@string/ipsum_1" />
<com.github.ivbaranov.mfb.MaterialFavoriteButton
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/card_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_padding"
android:text="Nice"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_padding"
android:text="@string/ipsum_en_1914_1" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/counter_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/starred_margin"
android:text="@string/starred" />
<TextView
android:id="@+id/counter_value"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/counter_text"
android:layout_marginLeft="@dimen/counter_value_margin" />
<com.github.ivbaranov.mfb.MaterialFavoriteButton
android:id="@+id/favorite_nice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
app:mfb_rotation_duration="400"
app:mfb_rotation_angle="216"
app:mfb_bounce_duration="700" />
</RelativeLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/card_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_padding"
android:text="Custom"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<com.github.ivbaranov.mfb.MaterialFavoriteButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
app:mfb_rotation_duration="700"
app:mfb_rotation_angle="360"
app:mfb_favorite_image="@mipmap/ic_event_available_black_24dp"
app:mfb_not_favorite_image="@mipmap/ic_event_busy_black_24dp"
app:mfb_animate_unfavorite="true"
app:mfb_bounce_duration="0" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_padding"
android:text="@string/ipsum_2" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</ScrollView>
Activity中实现:
public class MaterialFavoriteButtonActivity extends AppCompatActivity {
private TextView niceCounter;
private int niceCounterValue = 37;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_material_favorite_button);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//in the toolbar
MaterialFavoriteButton toolbarFavorite = new MaterialFavoriteButton.Builder(this) //
.favorite(true)
.color(MaterialFavoriteButton.STYLE_WHITE)
.type(MaterialFavoriteButton.STYLE_HEART)
.rotationDuration(400)
.create();
toolbar.addView(toolbarFavorite);
toolbarFavorite.setOnFavoriteChangeListener(
new MaterialFavoriteButton.OnFavoriteChangeListener() {
@Override
public void onFavoriteChanged(MaterialFavoriteButton buttonView, boolean favorite) {
Snackbar.make(buttonView, getString(R.string.toolbar_favorite_snack) + favorite,
Snackbar.LENGTH_SHORT).show();
}
});
//nice cardview
niceCounter = (TextView) findViewById(R.id.counter_value);
niceCounter.setText(String.valueOf(niceCounterValue));
MaterialFavoriteButton materialFavoriteButtonNice =
(MaterialFavoriteButton) findViewById(R.id.favorite_nice);
materialFavoriteButtonNice.setFavorite(true, false);
materialFavoriteButtonNice.setOnFavoriteChangeListener(
new MaterialFavoriteButton.OnFavoriteChangeListener() {
@Override
public void onFavoriteChanged(MaterialFavoriteButton buttonView, boolean favorite) {
if (favorite) {
niceCounterValue++;
} else {
niceCounterValue--;
}
}
});
materialFavoriteButtonNice.setOnFavoriteAnimationEndListener(
new MaterialFavoriteButton.OnFavoriteAnimationEndListener() {
@Override
public void onAnimationEnd(MaterialFavoriteButton buttonView, boolean favorite) {
niceCounter.setText(String.valueOf(niceCounterValue));
}
});
}
}
Photoview 图片放大缩放功能
效果图:
项目在GitHub上的地址:
https://github.com/chrisbanes/PhotoView
项目使用:
在gradle中添加
compile 'com.github.chrisbanes:PhotoView:1.2.6'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="com.zerom.mtest.PhotoViewActivity">
<uk.co.senab.photoview.PhotoView
android:id="@+id/pv_photoview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ico_guide01"
/>
</LinearLayout>
Activity中使用:
public class PhotoViewActivity extends AppCompatActivity {
@Bind(R.id.pv_photoview)
PhotoView pvPhotoview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo_view);
ButterKnife.bind(this);
PhotoViewAttacher photoViewAttacher = new PhotoViewAttacher(pvPhotoview);
photoViewAttacher.update();
}
}
Caldroid ,一个更好的Android日历控件
效果图:
项目在GitHub上的地址:
https://github.com/roomorama/Caldroid
项目使用:
在gradle中添加
compile 'com.roomorama:caldroid:3.0.1'
在XML中添加布局:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/calendar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
<LinearLayout
android:id="@+id/button_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/customize_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/customize"/>
<Button
android:id="@+id/show_dialog_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/show_dialog"/>
</LinearLayout>
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>
Activity中实现:
public class CaldroidActivity extends AppCompatActivity {
private boolean undo = false;
private CaldroidFragment caldroidFragment;
private CaldroidFragment dialogCaldroidFragment;
private void setCustomResourceForDates() {
Calendar cal = Calendar.getInstance();
// Min date is last 7 days
cal.add(Calendar.DATE, -7);
Date blueDate = cal.getTime();
// Max date is next 7 days
cal = Calendar.getInstance();
cal.add(Calendar.DATE, 7);
Date greenDate = cal.getTime();
if (caldroidFragment != null) {
ColorDrawable blue = new ColorDrawable(getResources().getColor(R.color.blue));
ColorDrawable green = new ColorDrawable(Color.GREEN);
caldroidFragment.setBackgroundDrawableForDate(blue, blueDate);
caldroidFragment.setBackgroundDrawableForDate(green, greenDate);
caldroidFragment.setTextColorForDate(R.color.white, blueDate);
caldroidFragment.setTextColorForDate(R.color.white, greenDate);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_caldroid);
final SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy");
// Setup caldroid fragment
// **** If you want normal CaldroidFragment, use below line ****
caldroidFragment = new CaldroidFragment();
// //////////////////////////////////////////////////////////////////////
// **** This is to show customized fragment. If you want customized
// version, uncomment below line ****
// caldroidFragment = new CaldroidSampleCustomFragment();
// Setup arguments
// If Activity is created after rotation
if (savedInstanceState != null) {
caldroidFragment.restoreStatesFromKey(savedInstanceState,
"CALDROID_SAVED_STATE");
}
// If activity is created from fresh
else {
Bundle args = new Bundle();
Calendar cal = Calendar.getInstance();
args.putInt(CaldroidFragment.MONTH, cal.get(Calendar.MONTH) + 1);
args.putInt(CaldroidFragment.YEAR, cal.get(Calendar.YEAR));
args.putBoolean(CaldroidFragment.ENABLE_SWIPE, true);
args.putBoolean(CaldroidFragment.SIX_WEEKS_IN_CALENDAR, true);
// Uncomment this to customize startDayOfWeek
// args.putInt(CaldroidFragment.START_DAY_OF_WEEK,
// CaldroidFragment.TUESDAY); // Tuesday
// Uncomment this line to use Caldroid in compact mode
// args.putBoolean(CaldroidFragment.SQUARE_TEXT_VIEW_CELL, false);
// Uncomment this line to use dark theme
// args.putInt(CaldroidFragment.THEME_RESOURCE, com.caldroid.R.style.CaldroidDefaultDark);
caldroidFragment.setArguments(args);
}
setCustomResourceForDates();
// Attach to the activity
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.calendar1, caldroidFragment);
t.commit();
// Setup listener
final CaldroidListener listener = new CaldroidListener() {
@Override
public void onSelectDate(Date date, View view) {
Toast.makeText(getApplicationContext(), formatter.format(date),
Toast.LENGTH_SHORT).show();
}
@Override
public void onChangeMonth(int month, int year) {
String text = "month: " + month + " year: " + year;
Toast.makeText(getApplicationContext(), text,
Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClickDate(Date date, View view) {
Toast.makeText(getApplicationContext(),
"Long click " + formatter.format(date),
Toast.LENGTH_SHORT).show();
}
@Override
public void onCaldroidViewCreated() {
if (caldroidFragment.getLeftArrowButton() != null) {
Toast.makeText(getApplicationContext(),
"Caldroid view is created", Toast.LENGTH_SHORT)
.show();
}
}
};
// Setup Caldroid
caldroidFragment.setCaldroidListener(listener);
final TextView textView = (TextView) findViewById(R.id.textview);
final Button customizeButton = (Button) findViewById(R.id.customize_button);
// Customize the calendar
assert customizeButton != null;
customizeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (undo) {
customizeButton.setText(getString(R.string.customize));
textView.setText("");
// Reset calendar
caldroidFragment.clearDisableDates();
caldroidFragment.clearSelectedDates();
caldroidFragment.setMinDate(null);
caldroidFragment.setMaxDate(null);
caldroidFragment.setShowNavigationArrows(true);
caldroidFragment.setEnableSwipe(true);
caldroidFragment.refreshView();
undo = false;
return;
}
// Else
undo = true;
customizeButton.setText(getString(R.string.undo));
Calendar cal = Calendar.getInstance();
// Min date is last 7 days
cal.add(Calendar.DATE, -7);
Date minDate = cal.getTime();
// Max date is next 7 days
cal = Calendar.getInstance();
cal.add(Calendar.DATE, 14);
Date maxDate = cal.getTime();
// Set selected dates
// From Date
cal = Calendar.getInstance();
cal.add(Calendar.DATE, 2);
Date fromDate = cal.getTime();
// To Date
cal = Calendar.getInstance();
cal.add(Calendar.DATE, 3);
Date toDate = cal.getTime();
// Set disabled dates
ArrayList<Date> disabledDates = new ArrayList<Date>();
for (int i = 5; i < 8; i++) {
cal = Calendar.getInstance();
cal.add(Calendar.DATE, i);
disabledDates.add(cal.getTime());
}
// Customize
caldroidFragment.setMinDate(minDate);
caldroidFragment.setMaxDate(maxDate);
caldroidFragment.setDisableDates(disabledDates);
caldroidFragment.setSelectedDates(fromDate, toDate);
caldroidFragment.setShowNavigationArrows(false);
caldroidFragment.setEnableSwipe(false);
caldroidFragment.refreshView();
// Move to date
// cal = Calendar.getInstance();
// cal.add(Calendar.MONTH, 12);
// caldroidFragment.moveToDate(cal.getTime());
String text = "Today: " + formatter.format(new Date()) + "\n";
text += "Min Date: " + formatter.format(minDate) + "\n";
text += "Max Date: " + formatter.format(maxDate) + "\n";
text += "Select From Date: " + formatter.format(fromDate)
+ "\n";
text += "Select To Date: " + formatter.format(toDate) + "\n";
for (Date date : disabledDates) {
text += "Disabled Date: " + formatter.format(date) + "\n";
}
textView.setText(text);
}
});
Button showDialogButton = (Button) findViewById(R.id.show_dialog_button);
final Bundle state = savedInstanceState;
assert showDialogButton != null;
showDialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Setup caldroid to use as dialog
dialogCaldroidFragment = new CaldroidFragment();
dialogCaldroidFragment.setCaldroidListener(listener);
// If activity is recovered from rotation
final String dialogTag = "CALDROID_DIALOG_FRAGMENT";
if (state != null) {
dialogCaldroidFragment.restoreDialogStatesFromKey(
getSupportFragmentManager(), state,
"DIALOG_CALDROID_SAVED_STATE", dialogTag);
Bundle args = dialogCaldroidFragment.getArguments();
if (args == null) {
args = new Bundle();
dialogCaldroidFragment.setArguments(args);
}
} else {
// Setup arguments
Bundle bundle = new Bundle();
// Setup dialogTitle
dialogCaldroidFragment.setArguments(bundle);
}
dialogCaldroidFragment.show(getSupportFragmentManager(),
dialogTag);
}
});
}
/**
* Save current states of the Caldroid here
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
if (caldroidFragment != null) {
caldroidFragment.saveStatesToKey(outState, "CALDROID_SAVED_STATE");
}
if (dialogCaldroidFragment != null) {
dialogCaldroidFragment.saveStatesToKey(outState,
"DIALOG_CALDROID_SAVED_STATE");
}
}
}
原链接地址:https://github.com/Trinea/android-open-project
Android 开源项目源码解析(Volley、UIL、Dagger、EventBus、xUtils 等分析)
Android 职位内部推荐(阿里、百度、美团、点评、魅族等)
codeKK
专注于开源项目源码解析、开源项目分享、Android 职位推荐。
我们的网站:www.codekk.com
我们的微博:code-kk
微信公众号:codekk,二维码如下:
欢迎大家推荐好的Android开源项目,可直接Commit,欢迎Star
、Fork
:)
关于我,欢迎关注
微博:Trinea 主页:trinea.cn 邮箱:trinea.cn#gmail.com 微信:codek2
更多:Android 开源库获取途径整理
分享:
目前包括:
Android开源项目第一篇——个性化控件(View)篇
包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style、其他
Android开源项目第二篇——工具库篇
包括依赖注入、图片缓存、网络相关、数据库ORM工具包、Android公共库、高版本向低版本兼容库、多媒体、事件总线、传感器、安全、插件化、文件、其他
Android开源项目第三篇——优秀项目篇
比较有意思的完整的Android项目
Android开源项目第四篇——开发及测试工具篇
包括开发效率工具、开发自测相关、测试工具、开发及编译环境、其他
Android开源项目第五篇——优秀个人和团体篇
乐于分享并且有一些很不错的开源项目的个人和组织,包括JakeWharton、Chris Banes、Koushik Dutta等大牛
第一部分 个性化控件(View)
主要介绍那些不错个性化的View,包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style等等。
一、ListView
android-pulltorefresh
一个强大的拉动刷新开源项目,支持各种控件下拉刷新,ListView、ViewPager、WebView、ExpandableListView、GridView、ScrollView、Horizontal ScrollView、Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多。并且它实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好。
项目地址:https://github.com/chrisbanes/Android-PullToRefresh
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true
APP示例:新浪微博各个页面android-pulltorefresh-listview
下拉刷新ListView,这个被很多人使用的项目实际有不少bug,推荐使用上面的android-pulltorefresh
项目地址:https://github.com/johannilsson/android-pulltorefresh
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refresh-listview-demo.apk?raw=true-
android-Ultra-Pull-to-Refresh
下拉刷新,第一个项目已经停止维护了,并且使用起来相对复杂,定制性也差。这个是替代和改良方案。这个继承于ViewGroup可以包含任何View。功能甚至比SwipeRefreshLayout强大。使用起来非常简单。良好的设计,如果你想定制自己的UI样式,非常简单,就像给ListView加一个Header View那么简单。支持API LEVEL >= 8
项目地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
Demo地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh/blob/master/ptr-demo/target/ultra-ptr-demo.apk?raw=true
效果图: DropDownListView
下拉刷新及滑动到底部加载更多ListView
项目地址:https://github.com/Trinea/AndroidCommon
Demo地址:https://play.google.com/store/apps/details?id=cn.trinea.android.demo
文档介绍:http://www.trinea.cn/android/dropdown-to-refresh-and-bottom-load-more-listview/DragSortListView
拖动排序的ListView,同时支持ListView滑动item删除,各个Item高度不一、单选、复选、CursorAdapter做为适配器、拖动背景变化等
项目地址:https://github.com/bauerca/drag-sort-listview
Demo地址:https://play.google.com/store/apps/details?id=com.mobeta.android.demodslv
APP示例:Wordpress AndroidSwipeListView
支持定义ListView左右滑动事件,支持左右滑动位移,支持定义动画时间
项目地址:https://github.com/47deg/android-swipelistview
Demo地址:https://play.google.com/store/apps/details?id=com.fortysevendeg.android.swipelistview
APP示例:微信Android-SwipeToDismiss
滑动Item消失ListView,支持3.0以下版本见:https://github.com/JakeWharton/SwipeToDismissNOA
项目地址:https://github.com/romannurik/Android-SwipeToDismiss
Demo地址:https://github.com/JakeWharton/SwipeToDismissNOA/SwipeToDismissNOA.apk/qr_codePinnedHeaderExpandableListView
首先它是一个ExpandableListView,但是它的头部可以固定,其次,在它的上面还有一个头部可以来回伸缩
项目地址:https://github.com/singwhatiwanna/PinnedHeaderExpandableListView
效果图:
APP示例:百度手机卫士垃圾清理界面StickyListHeaders
GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView,支持快速滑动,支持Android2.3及以上
项目地址:https://github.com/emilsjolander/StickyListHeaders
效果图:
APP示例:Android 4.0联系人pinned-section-listview
GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView
项目地址:https://github.com/beworker/pinned-section-listview
效果图:PinnedHeaderListView
GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView
项目地址:https://github.com/JimiSmith/PinnedHeaderListViewQuickReturn
ListView/ScrollView的header或footer,当向下滚动时消失,向上滚动时出现
项目地址:https://github.com/lawloretienne/QuickReturn
Demo地址:https://play.google.com/store/apps/details?id=com.etiennelawlor.quickreturnQuickReturnHeader
ListView/ScrollView的header或footer,当向下滚动时消失,向上滚动时出现
项目地址:https://github.com/ManuelPeinado/QuickReturnHeader
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/quick-return-header-demo.apk?raw=true
APP示例:google plusIndexableListView
ListView右侧会显示item首字母快捷索引,点击可快速滑动到某个item
项目地址:https://github.com/woozzu/IndexableListView
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/indexable-listview.apk?raw=true
APP示例:微信通讯录、小米联系人CustomFastScrollView
ListView快速滑动,同时屏幕中间PopupWindows显示滑动到的item内容或首字母
项目地址:https://github.com/nolanlawson/CustomFastScrollViewDemo
效果图:Android-ScrollBarPanel
ListView滑动时固定的Panel指示显示在scrollbar旁边
项目地址:https://github.com/rno/Android-ScrollBarPanel
效果图:SlideExpandableListView
用户点击listView item滑出固定区域,其他item的区域收缩
项目地址:https://github.com/tjerkw/Android-SlideExpandableListView
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/slide-expandable-listView-demo.apk?raw=trueJazzyListView
ListView及GridView item以特殊动画效果进入屏幕,效果包括grow、cards、curl、wave、flip、fly等等
项目地址:https://github.com/twotoasters/JazzyListView
Demo地址:https://play.google.com/store/apps/details?id=com.twotoasters.jazzylistview.sample
在线演示:http://lab.hakim.se/scroll-effects/ListViewAnimations
带Item显示动画的ListView,动画包括底部飞入、其他方向斜飞入、下层飞入、渐变消失、滑动删除等
项目地址:https://github.com/nhaarman/ListViewAnimations
Demo地址:https://play.google.com/store/apps/details?id=com.haarman.listviewanimations
APP示例:Google plus、Google Now卡片式进入、小米系统中应用商店、联系人、游戏中心、音乐、文件管理器的ListView、Ultimate、Light Flow Lite、TreinVerkeer、Running Coach、Pearl Jam Lyrics、Calorie Chart、Car Hire、Super BART、DK FlashCards、Counter Plus、Voorlees Verhaaltjes 2.0DevsmartLib-Android
横向ListView
项目地址:https://github.com/dinocore1/DevsmartLib-Android
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/horizontal-listview-demo.apk?raw=trueTwoWayView
横向ListView的效果,继承自AdapterView
项目地址:https://github.com/lucasr/twoway-viewHorizontalVariableListView
支持Item宽度不一致的ListView
项目地址:https://github.com/sephiroth74/HorizontalVariableListViewLinearListView
用LinearLayout实现的ListView,可解决多个ListView并存等问题。目前自己也有需要,等亲自尝试过后会再具体介绍
项目地址:https://github.com/frankiesardo/LinearListViewMultiChoiceAdapter
支持多选的ListView Adapter
项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter
Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.multichoiceadapter.demoEnhancedListView
支持横向滑动删除列表项以及撤销删除的ListView,该项目的前身是SwipeToDismissUndoList
项目地址:https://github.com/timroes/EnhancedListView
Demo地址:https://play.google.com/store/apps/details?id=de.timroes.android.listviewdemo&rdid=de.timroes.android.listviewdemoListBuddies
自动滚动的双列ListView ,两个ListView滚动速度不一致,有视差效果
项目地址:https://github.com/jpardogo/ListBuddies
Demo地址:https://play.google.com/store/apps/details?id=com.jpardogo.android.listbuddies
效果图:SwipeMenuListView
针对ListView item的侧滑菜单
项目地址:https://github.com/baoyongzhang/SwipeMenuListView
效果图:
APP示例:手机QQV5.0PagingListView
分页加载的ListView。当滑动到ListView底部最后一个元素时,显示一个进度行,然后加载下一页数据,并显示。
项目地址:https://github.com/nicolasjafelle/PagingListViewPullZoomView
支持下拉时HeaderView缩放的ListView、ScrollView
项目地址:https://github.com/Frank-Zhu/PullZoomView
效果图:PullToZoomInListView
滑动ListView时使其HeaderView跟随滑动缩放
项目地址:https://github.com/matrixxun/PullToZoomInListView
效果图:CalendarListview
实现每个月一行日历效果的ListView
项目地址:https://github.com/traex/CalendarListview
效果图:sticky-headers-recyclerview
GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ListView,采用support-v7中的RecyclerView实现
项目地址:https://github.com/timehop/sticky-headers-recyclerviewPullSeparateListView
到达顶部或底部继续拉动时,实现Item间的相互分离,两种模式:(1) 全部分离的模式,即屏幕内所有Item都会分离 (2)部分分离模式,以点击位置为分界点,部分item分离
项目地址:https://github.com/chiemy/PullSeparateListView
效果图:ExpandableLayout
Header 和 Content Item 都可以展开的 ExpandableListview
项目地址:https://github.com/traex/ExpandableLayoutPagedHeadListView
支持paginated header以及material page indicator的ListView.
项目地址:https://github.com/JorgeCastilloPrz/PagedHeadListView
效果图:CustomSwipeListView
支持左滑弹出自定义菜单,右滑删除且允许撤销,同时可以自定义滑动动画时间和滑动触发事件的时机等。
项目地址:https://github.com/xyczero/Android-CustomSwipeListView
效果图:
Demo地址:Download herePull-to-Refresh.Rentals-Android
提供一个简单可以自定义的下拉刷新实现,Yalantis 出品。
项目地址:https://github.com/Yalantis/Pull-to-Refresh.Rentals-Android
效果图:ScrollerCalendar
实现每行显示一年的12个月份的RecyclerView年历
项目地址:https://github.com/guanchao/ScrollerCalendar
效果图:
二、ActionBar
ActionBarSherlock
为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题
项目地址:https://github.com/JakeWharton/ActionBarSherlock
Demo地址:https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos
APP示例:太多了。。现在连google都在用ActionBar-PullToRefresh
下拉刷新,ActionBar出现加载中提示
项目地址:https://github.com/chrisbanes/ActionBar-PullToRefresh
Demo地址:https://play.google.com/store/apps/details?id=uk.co.senab.actionbarpulltorefresh.samples.stock
APP示例:Gmail,Google plus,知乎等FadingActionBar
ListView向下滚动逐渐显现的ActionBar
项目地址:https://github.com/ManuelPeinado/FadingActionBar
Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.fadingactionbar.demo
APP示例:google music,知乎NotBoringActionBar
google music下拉收缩的ActionBar
项目地址:https://github.com/flavienlaurent/NotBoringActionBar
Demo地址:http://flavienlaurent.com/blog/2013/11/20/making-your-action-bar-not-boring/
APP示例:Google音乐RefreshActionItem
带进度显示和刷新按钮的ActionBar
项目地址:https://github.com/ManuelPeinado/RefreshActionItem
Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.refreshactionitem.demo
APP示例:The New York Times,DevAppsDirect.GlassActionBar
类似玻璃的有一定透明度的ActionBar
项目地址:https://github.com/ManuelPeinado/GlassActionBar
Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.glassactionbardemo
APP示例:google music
三、Menu
MenuDrawer
滑出式菜单,通过拖动屏幕边缘滑出菜单,支持屏幕上下左右划出,支持当前View处于上下层,支持Windows边缘、ListView边缘、ViewPager变化划出菜单等。
项目地址:https://github.com/SimonVT/android-menudrawer
Demo地址:http://simonvt.github.io/android-menudrawer/
APP示例:Gmail、Google Music等大部分google appSlidingMenu
滑出式菜单,通过拖动屏幕边缘滑出菜单,支持屏幕左右划出,支持菜单zoom、scale、slide up三种动画样式出现。与MenuDrawer相比而言,SlidingMenu支持菜单动画样式出现,MenuDrawer支持菜单view处于内容的上下层
项目地址:https://github.com/jfeinstein10/SlidingMenu
Demo地址:https://play.google.com/store/apps/details?id=com.slidingmenu.example
APP示例:Foursquare, LinkedIn, Zappos, Rdio, Evernote Food, Plume, VLC for Android, ESPN ScoreCenter, MLS MatchDay, 9GAG, Wunderlist 2, The Verge, MTG Familiar, Mantano Reader, Falcon Pro (BETA), MW3 BarracksArcMenu
支持类似Path的左下角动画旋转菜单及横向划出菜单、圆心弹出菜单
项目地址:https://github.com/daCapricorn/ArcMenu
效果图:
https://dl.dropboxusercontent.com/u/11369687/preview1.png
https://dl.dropboxusercontent.com/u/11369687/raymenu.png
APP示例:Pathandroid-satellite-menu
类似Path的左下角动画旋转菜单
项目地址:https://github.com/siyamed/android-satellite-menu
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/satellite-menu-demo.apk?raw=true
APP示例:Pathradial-menu-widget
圆形菜单,支持二级菜单
项目地址:https://code.google.com/p/radial-menu-widget/
效果图:http://farm8.staticflickr.com/7377/11621125154_d1773c2dcc_o.jpgAndroid Wheel Menu
圆形旋转选取菜单
项目地址:https://github.com/anupcowkur/Android-Wheel-Menu
效果图:FoldingNavigationDrawer
滑动并以折叠方式打开菜单
项目地址:https://github.com/tibi1712/FoldingNavigationDrawer-Android
Demo地址:https://play.google.com/store/apps/details?id=com.ptr.folding.sample
效果图:AndroidResideMenu
仿 Dribbble 的边栏菜单
项目地址:https://github.com/SpecialCyCi/AndroidResideMenu
效果图:CircularFloatingActionMenu
一个可定制的圆形的浮动菜单控件,类似于Path的圆形菜单。这个控件的可定制性更强,可以很容易的定制菜单出现消失时的动画,起始角度和半径。
项目地址:https://github.com/oguzbilgener/CircularFloatingActionMenu
Demo地址:https://github.com/oguzbilgener/CircularFloatingActionMenu/tree/master/samples
效果图:NavigationDrawerSI
Navigation Drawer的一个简单实现,滑动并以折叠方式打开菜单
项目地址:https://github.com/mmBs/NavigationDrawerSI
Demo地址:https://play.google.com/store/apps/details?id=mmbialas.pl.navigationdrawersi
效果图:
APP示例:https://play.google.com/store/apps/details?id=mmbialas.pl.navigationdrawersiDragLayout
使用support.v4包下的ViewDragHelper实现QQ5.0侧滑
项目地址:https://github.com/BlueMor/DragLayout
效果图:LDrawer
Material Design 形式的展开折叠Icon
项目地址:https://github.com/ikimuhendis/LDrawer
效果图:Floating Action Button
悬浮的圆形菜单栏,支持组建滚动时自动隐藏及其他设置
项目地址:https://github.com/shamanland/floating-action-button
效果图:Side-Menu.Android
分类侧滑菜单,Yalantis 出品。
项目地址:https://github.com/Yalantis/Side-Menu.Android
效果图:Context-Menu.Android
可以方便快速集成漂亮带有动画效果的上下文菜单,Yalantis出品。
项目地址:https://github.com/Yalantis/Context-Menu.Android
效果图:
四、ViewPager 、Gallery
Android-ViewPagerIndicator
配合ViewPager使用的Indicator,支持各种位置和样式
项目地址:https://github.com/JakeWharton/Android-ViewPagerIndicator
Demo地址:https://play.google.com/store/apps/details?id=com.viewpagerindicator.sample
APP示例:太多了。。JazzyViewPager
支持Fragment切换动画的ViewPager,动画包括转盘、淡入淡出、翻页、层叠、旋转、方块、翻转、放大缩小等,效果类似桌面左右切换的各种效果,不过桌面并非用ViewPager实现而已
项目地址:https://github.com/jfeinstein10/JazzyViewPager
Demo地址:https://github.com/jfeinstein10/JazzyViewPager/blob/master/JazzyViewPager.apk?raw=trueJellyViewPager
特殊切换动画的ViewPager
项目地址:https://github.com/chiemy/JellyViewPager
效果图:Android-DirectionalViewPager
支持横向和纵向(垂直)的ViewPager
项目地址:https://github.com/JakeWharton/Android-DirectionalViewPager
Demo地址:https://market.android.com/details?id=com.directionalviewpager.sampleandroid-pulltorefresh
支持下拉刷新的ViewPager
项目地址:https://github.com/chrisbanes/Android-PullToRefresh
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true
APP示例:新浪微博各个页面FancyCoverFlow
支持Item切换动画效果的类似Gallery View
项目地址:https://github.com/davidschreiber/FancyCoverFlow
Demo地址:https://play.google.com/store/apps/details?id=at.technikum.mti.fancycoverflow.samples
效果图:AndroidTouchGallery
支持双击或双指缩放的Gallery(用ViewPager实现),相比下面的PhotoView,在被放大后依然能滑到下一个item,并且支持直接从url和文件中获取图片,
项目地址:https://github.com/Dreddik/AndroidTouchGallery
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/touch-gallery-demo.apk?raw=true
APP示例:类似微信中查看聊天记录图片时可双击放大,并且放大情况下能正常左右滑动到前后图片Android Auto Scroll ViewPager
Android自动滚动 轮播循环的ViewPager
项目地址:https://github.com/Trinea/android-auto-scroll-view-pager
Demo地址:https://play.google.com/store/apps/details?id=cn.trinea.android.demo
文档介绍:http://www.trinea.cn/android/auto-scroll-view-pager/Salvage view
带View缓存的Viewpager PagerAdapter,很方便使用
项目地址:https://github.com/JakeWharton/salvageAndroid PagerSlidingTabStrip
配合ViewPager使用的Indicator,支持ViewPager Scroll时Indicator联动
项目地址:https://github.com/astuetz/PagerSlidingTabStrip
Demo地址:https://play.google.com/store/apps/details?id=com.astuetz.viewpager.extensions.sampleViewPager3D
ViewPager3D效果
项目地址:https://github.com/inovex/ViewPager3DAnimaTabsview
仿网易云音乐标签切换的动画,带透明小三角
项目地址:https://github.com/wuyexiong/transparent-over-animtabsview
在线演示:http://v.youku.com/v_show/id_XNzA4MjY5NjA0.htmlLoopingViewPager
无限循环的ViewPager
项目地址:https://github.com/imbryk/LoopingViewPagerandroid_page_curl
翻书卷曲效果
项目地址:https://github.com/harism/android_page_curl
APP示例:iReader
在线演示:https://www.youtube.com/watch?v=iwu7P5PCpswViewPagerIndicator
简化并实现android的TabHost效果,顶部滑动tab,引导页,支持自定义tab样式,自定义滑动块样式和位置,自定义切换tab的过渡动画,子界面的预加载和界面缓存,设置界面是否可滑动
项目地址:https://github.com/LuckyJayce/ViewPagerIndicatorScreenSlideIndicator
轻量级的圆形 Indicadtor,位置可以*调整,不会对 ViewPager 产生任何影响。
项目地址:ScreenSlidePager
效果图:
五、GridView
StaggeredGridView
允许非对齐行的GridView,类似Pinterest的瀑布流,并且跟ListView一样自带View缓存,继承自ViewGroup
项目地址:https://github.com/maurycyw/StaggeredGridView
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/staggered-gridview-demo.apk?raw=true
APP示例:Pinterest等AndroidStaggeredGrid
允许非对齐行的GridView,类似Pinterest的瀑布流,继承自AbsListView
项目地址:https://github.com/etsy/AndroidStaggeredGrid
APP示例:Pinterest等PinterestLikeAdapterView
允许非对齐行的GridView,类似Pinterest的瀑布流,允许下拉刷新
项目地址:https://github.com/GDG-Korea/PinterestLikeAdapterView
APP示例:Pinterest等DraggableGridView
Item可拖动交换位置的GridView,实际是自己继承ViewGroup实现,类似桌面的单屏效果,可屏幕自动上下滚动进行Item移动交换,多屏效果见下面PagedDragDropGrid
项目地址:https://github.com/thquinn/DraggableGridView
Demo地址:https://github.com/thquinn/DraggableGridView/blob/master/bin/DraggableGridViewSample.apk?raw=trueStickyGridHeaders
GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的GridView
项目地址:https://github.com/TonicArtos/StickyGridHeaders
效果图:PagedDragDropGrid
Item可拖动交换位置、拖动删除的自定义控件,实际是自己继承ViewGroup实现,类似桌面的多屏效果,可拖动到屏幕边缘,屏幕自动左右滚动进行Item移动交换,可拖动进行删除,单屏效果见上面DraggableGridView
项目地址:https://github.com/mrKlar/PagedDragDropGrid
在线演示:http://youtu.be/FYTSRfthSuQAndroid-DraggableGridViewPager
Item可拖动交换位置的GridView,实际是自己继承ViewGroup实现,类似桌面的多屏效果,可屏幕自动左右滚动进行Item移动交换,单屏效果见上面DraggableGridView
项目地址:https://github.com/zzhouj/Android-DraggableGridViewPager
Demo地址:https://github.com/Trinea/trinea-download/blob/master/draggable-grid-viewpager-demo.apk?raw=trueTwoWayGridView
可横向滚动的GridView
项目地址:https://github.com/jess-anders/two-way-gridviewPagingGridView
分页加载的GridView。当滑动到GridView底部最后一个行时,显示一个进度行,然后加载下一页数据,并显示。
项目地址:https://github.com/nicolasjafelle/PagingGridViewAsymmetricGridView
一个支持跨行和跨列可变Item大小的GridView
项目地址:https://github.com/felipecsl/AsymmetricGridView
Demo地址:https://play.google.com/store/apps/details?id=com.felipecsl.asymmetricgridview.app
效果图:GridView with Header and Footer
和ListView
一样带头部和底部的GridView
,用法和ListView
一样
项目地址:https://github.com/liaohuqiu/android-GridViewWithHeaderAndFooter
效果图:
六、ImageView
PhotoView
支持双击或双指缩放的ImageView,在ViewPager等Scrolling view中正常使用,相比上面的AndroidTouchGallery,不仅支持ViewPager,同时支持单个ImageView
项目地址:https://github.com/chrisbanes/PhotoView
Demo地址:https://play.google.com/store/apps/details?id=uk.co.senab.photoview.sample
APP示例:photupandroid-gif-drawable
支持gif显示的view,用jni实现的,编译生成so库后直接xml定义view即可,而且本身不依赖于其他开源项目所以相对下面的ImageViewEx简单的多
项目地址:https://github.com/koral--/android-gif-drawableImageViewEx
支持Gif显示的ImageView,依赖很多,编译过程很繁琐
项目地址:https://github.com/frapontillo/ImageViewEx
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/imageviewex-demo.apk?raw=trueRoundedImageView
带圆角的ImageView
项目地址:https://github.com/vinc3m1/RoundedImageView
效果图:SelectableRoundedImageView
ImageView允许四个角的每一个有不同的半径值。也允许椭圆形、圆形的形状或者边
项目地址:https://github.com/pungrue26/SelectableRoundedImageView
Demo地址:https://play.google.com/store/apps/details?id=com.joooonho
效果图:ColorArt
根据图片的均色设置背景色显示文字和图片,类似itune11中效果
项目地址:https://github.com/MichaelEvans/ColorArt
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/color-art-demo.apk?raw=trueCircleImageView
圆形的ImageView
项目地址:https://github.com/hdodenhof/CircleImageView
效果图:ImageViewZoom
支持放大和平移的ImageView
项目地址:https://github.com/sephiroth74/ImageViewZoom
APP示例:https://play.google.com/store/apps/details?id=com.aviary.android.featherKenBurnsView
实现Ken Burns effect效果,达到身临其境效果的ImageView
项目地址:https://github.com/flavioarfaria/KenBurnsViewCustomShapeImageView
各种形状的ImageView, 相比上面的圆形ImageView,多了更多形状
项目地址:https://github.com/MostafaGazar/CustomShapeImageView
效果图:Shape Image View
可以自定义各种形状的ImageView, 并且支持边框
项目地址:https://github.com/siyamed/android-shape-imageview
效果图:TextDrawable
一个用于生成带有文本或者字母的图片的轻量级库。扩展自Drawable,因此可用于现有/自定义/网络等ImageView类,并且包含一个流接口用于创建drawables以及一个定制的ColorGenerator
项目地址:https://github.com/amulyakhare/TextDrawable
效果图:
七、ProgressBar
SmoothProgressBar
水平进度条
项目地址:https://github.com/castorflex/SmoothProgressBar
Demo地址:https://play.google.com/store/apps/details?id=fr.castorflex.android.smoothprogressbar.sampleProgressWheel
支持进度显示的圆形ProgressBar
项目地址:https://github.com/Todd-Davies/ProgressWheel
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/progress-wheel-demo.apk?raw=trueandroid-square-progressbar
在图片周围显示进度
项目地址:https://github.com/mrwonderman/android-square-progressbar
Demo地址:https://play.google.com/store/apps/details?id=net.yscs.android.square_progressbar_example
效果图:
APP示例:squareHoloCircularProgressBar
Android4.1 时钟App样式
项目地址:https://github.com/passsy/android-HoloCircularProgressBar
效果图:
APP示例:Android4.1时钟AppProgressButton
通过图钉的不同状态显示进度
项目地址:https://github.com/f2prateek/progressbutton
效果图:
文档介绍:http://f2prateek.com/progressbutton/GoogleProgressBar
类似google 多个圆形卡片翻转的progressBar
项目地址:https://github.com/jpardogo/GoogleProgressBar
效果图:TH-ProgressButton
带圆形进度显示的按钮
项目地址;https://github.com/torryharris/TH-ProgressButton
效果图:NumberProgressBar
带数字进度的进度条
项目地址:https://github.com/daimajia/NumberProgressBar
效果图:CircularProgressDrawable
带圆形进度显示的进度条
项目地址:https://github.com/Sefford/CircularProgressDrawable
效果图:Android-RoundCornerProgressBar
Android 圆角 ProgressBar,可自定义圆角颜色和半径,包括带 Icon 和不带 Icon 两种类型。
项目地址:https://github.com/akexorcist/Android-RoundCornerProgressBar
效果图:circular-progress-button
带进度显示的Button
项目地址:https://github.com/dmytrodanylyk/circular-progress-button
效果图:WaveView
一个波纹效果的 View,可用来做 ProgressBar
项目地址:https://github.com/john990/WaveView
Demo地址:https://raw.github.com/john990/WaveView/master/screenshot%26apk/demo.unaligned.apk
效果图:
八、TextView
包括TextView及所有继承自TextView控件,如EditText、Button、RadioButton
android-flowtextview
文字自动环绕其他View的Layout
项目地址:https://github.com/deano2390/FlowTextView
效果图:http://i949.photobucket.com/albums/ad332/vostroman1500/1.pngAndroid Form EditText
验证输入合法性的编辑框,支持输入、英文、ip、url等多种正则验证
项目地址:https://github.com/vekexasia/android-edittext-validator
Demo地址:https://play.google.com/store/apps/details?id=com.andreabaccega.edittextformexampleEmojicon
支持emojis的TextView和EditText
项目地址:https://github.com/rockerhieu/emojicon
文档介绍:http://rockerhieu.com/emojicon/android-circlebutton
Android圆形按钮,实际实现是继承自ImageView
项目地址:https://github.com/markushi/android-circlebutton
Demo地址:https://github.com/markushi/android-circlebutton/blob/master/example/example.apkSegmented Radio Buttons for Android
iOS’s segmented controls的实现
项目地址:https://github.com/vinc3m1/android-segmentedradiobutton
Demo地址:https://github.com/thquinn/DraggableGridView/blob/master/bin/DraggableGridViewSample.apk?raw=true
效果图:Chips EditText Library
支持国家名字联想从而选择显示该国国旗的EditText,实际就是通过SpannableStringBuilder实现
项目地址:https://github.com/kpbird/chips-edittext-library
Demo地址:https://github.com/kpbird/chips-edittext-library/tree/master/ChipsEditTextDemo/binAutoFitTextView
可固定边界内容字体大小自适应的TextView
项目地址:https://github.com/grantland/android-autofittextviewShimmer for Android
文字发淡光的TextView
项目地址:https://github.com/RomainPiel/Shimmer-androidTitanic
可以显示水位上升下降(不知道该怎么描述 囧)的TextView
项目地址:https://github.com/RomainPiel/Titanic
效果图:android-iconify
提供带Icon的TextView,Menu,Button等
项目地址:https://github.com/JoanZapata/android-iconifyCalligraphy
让我们在android开发中使用自定义字体变得更加简单
项目地址 :https://github.com/chrisjenx/Calligraphy
效果图:CreditsRoll
类似星球大战字幕效果的TextView
项目地址:https://github.com/frakbot/CreditsRollandroid-process-buton
带加载或提交进度的Button
项目地址:https://github.com/dmytrodanylyk/android-process-butonFButton
扁平化的Button
项目地址:https://github.com/hoang8f/android-flat-button
Demo地址:https://play.google.com/store/apps/details?id=info.hoang8f.fbutton.demoFloatingActionButton
一个类似Android版Google+浮动功能按钮的控件,可以响应ListView的滚动事件。当列表向上滚动的时候会自动显示,向下滚动的时候自动隐藏。
项目地址:https://github.com/makovkastar/FloatingActionButton
Demo地址:https://github.com/makovkastar/FloatingActionButton/tree/master/
效果图:Android Saripaar
Android表单验证
项目地址:https://github.com/ragunathjawahar/android-saripaar/JumpingBeans
文字像 Mexican beans 一样跳动
项目地址:https://github.com/frakbot/JumpingBeans
Demo地址:http://play.google.com/store/apps/details?id=net.frakbot.jumpingbeans.demo
效果图:FancyButtons
一个不用图片就可以帮助我们创建出漂亮按钮的库。
项目地址:https://github.com/medyo/fancybuttons
Demo地址:https://github.com/medyo/fancybuttons/tree/master/samples
效果图:Android-RobotoTextView
一个实现了所有Roboto字体的TextView,包括新出的Roboto Slab字体。
项目地址:https://github.com/johnkil/Android-RobotoTextView
Demo地址:http://play.google.com/store/apps/details?id=com.devspark.robototextview
Demo项目:https://github.com/johnkil/Android-RobotoTextView/tree/master/robototextview-sample
效果图:>Android-WizardPager
一个表单向导库
项目地址:https://github.com/romannurik/android-wizardpager
Demo项目:https://github.com/str4d/android-wizardpager/tree/textfield
效果图:RippleView
一个实现了 Android L 上才引入的点击按钮后出现水波纹效果的按钮
项目地址:https://github.com/siriscac/RippleView
Demo项目:https://github.com/siriscac/RippleView/tree/master/RippleViewExample
效果图:RippleEffect
一个实现Material Design Ripple效果的库,支持Android API 9+以上版本。
项目地址:https://github.com/traex/RippleEffect
Demo项目:https://github.com/traex/RippleEffect/tree/master/sample
效果图:Android Floating Label Widgets
包含一系列控件,这些控件特点是:有默认值,当值不为空时默认值浮动到上面变为提示
项目地址:https://github.com/marvinlabs/android-floatinglabel-widgets
Demo地址:https://play.google.com/store/apps/details?id=com.marvinlabs.widget.floatinglabel.demo
在线演示:http://www.youtube.com/watch?v=hpZD9gJcRg0&feature=youtu.beMaterialEditText
EditText 的 Material Design 实现。包含 Google Material Design Spec中的UI效果和一些新增特性。
项目地址:https://github.com/rengwuxian/MaterialEditTextMultiActionTextView
可以分别给TextView中的某几个字设置点击事件的TextView
项目地址:https://github.com/ajaysahani/MultiActionTextView
效果图:ToggleButton
状态切换的 Button,类似 iOS,用 View 实现
项目地址:https://github.com/zcweng/ToggleButton
效果图:SlideSwitch
状态切换的开关,可以设置为类似IOS的圆形,也可以设置为矩形,用 View 实现
项目地址:https://github.com/Leaking/SlideSwitch
效果图:ExpandableTextView
可展开和收缩内容的TextView。
项目地址:https://github.com/Manabu-GT/ExpandableTextView
效果图:
九、ScrollView
Discrollview
支持滚动时Item淡入淡出,平移,缩放效果的ScrollView
项目地址:https://github.com/flavienlaurent/discrollview
Demo地址:https://github.com/flavienlaurent/discrollview/raw/master/sample.apkPullScrollView
仿照新浪微博Android客户端个人中心的ScrollView,下拉背景伸缩回弹效果。
项目地址:https://github.com/MarkMjw/PullScrollView
效果图:ParallaxScrollView
支持视差滚动的ScrollView ,背景图片的滚动速度小于ScrollView中子控件的滚动速度
项目地址:https://github.com/chrisjenx/ParallaxScrollView
Demo地址:http://cloud.github.com/downloads/chrisjenx/ParallaxScrollView/ParallaxScrollViewDemo-v1.0.5.apkAKParallax-Android
支持视差滚动的ScrollView
项目地址:https://github.com/ideaismobile/AKParallax-Android
Demo地址:https://play.google.com/store/apps/details?id=com.appkraft.parallax_sampleAndroid-ObservableScrollView
监听滚动视图滚动事件的库,帮助与Toolbar的交互动效处理与Material Design的实现
项目地址:https://github.com/ksoichiro/Android-ObservableScrollView
Demo地址:https://play.google.com/store/apps/details?id=com.github.ksoichiro.android.observablescrollview.samples2OverScrollView
有弹性的ScrollView,实现了当手指滑动到ScrollView的顶部、底部时,可以继续的向上、向下拉伸。当释放手指的时候,向上、下回弹
项目地址:https://github.com/EverythingMe/OverScrollView
十、TimeView
包括TimePicker、DatePicker、CalendarView、Clock等时间相关控件
android-times-square
Android日历时间部件,支持选取单个日期,多个日期,及日期区间段和对话框形式显示
项目地址:https://github.com/square/android-times-square
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/times-square-demo.apk?raw=trueandroid-calendar-card
日历
项目地址:https://github.com/kenumir/android-calendar-card
Demo地址:https://play.google.com/store/apps/details?id=com.wt.calendarcardsample
效果图:AndroidWheel
Android Wheel支持城市、多种日期时间、密码、图片
项目地址:https://code.google.com/p/android-wheel/
效果图:GoogleDateTimePickers
时间选择部件
项目地址:https://github.com/Mirkoddd/GoogleDateTimePickers
文档介绍:https://play.google.com/store/apps/details?id=com.mirko.sample&hl=itDateTimePicker
日期选择部件(Google Agenda的样式风格)
项目地址:https://github.com/flavienlaurent/datetimepicker
Demo地址:https://raw.github.com/biboune/datetimepicker/master/datetimepicker-sample.apk
效果图:android-betterpickers
提供日期、数字、时间(数字方式和钟表方式)、重复周期(闹钟的周期重复)、HMS(时、分、秒)的选择,支持以DialogFragment的弹窗选择
项目地址:https://github.com/derekbrameyer/android-betterpickers
Demo地址:https://play.google.com/store/apps/details?id=com.doomonafireball.betterpickers.sample 效果图:Android Week View
日期控件,支持周,天视图,支持自定义样式
项目地址:https://github.com/alamkanak/Android-Week-View
效果图:
十一、TipView
包括Toast、角标、UndoBar等提示性控件
Crouton
丰富样式的Toast,允许alert、comfirm、info样式及点击消失样式,允许设置Toast显示时间,允许自定义View。 本文32. SuperToasts为其扩展版
项目地址:https://github.com/keyboardsurfer/Crouton
Demo地址:http://play.google.com/store/apps/details?id=de.keyboardsurfer.app.demo.croutonsupertooltips
带动画效果的Tips显示
项目地址:https://github.com/nhaarman/supertooltips
Demo地址:https://play.google.com/store/apps/details?id=com.haarman.supertooltipsAndroid ViewBadger
为其他View添加角标等
项目地址:https://github.com/jgilfelt/android-viewbadger
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/android-viewbadger.apk?raw=true
效果图:SuperToasts
更丰富样式的toast,支持Button、Progress、Horizontal Progress样式、支持进入动画、支持撤销及其动画设置
项目地址:https://github.com/JohnPersano/SuperToasts
Demo地址:https://play.google.com/store/apps/details?id=com.supertoastsdemo
效果图:UndoBar
屏幕底部显示取消或是确认的PopupWindows
项目地址:https://github.com/soarcn/UndoBar
效果图:UndoBar
屏幕底部显示取消或是确认某操作
项目地址:https://github.com/jenzz/Android-UndoBar
效果图:Android-ActionItemBadge
可以在ActionBar的MenuItem上显示一个小角标
项目地址:https://github.com/mikepenz/Android-ActionItemBadge
效果图:SnackBar
Material Design 风格的 Toast,类似 Google inbox 中的提示
项目地址:https://github.com/MrEngineer13/SnackBar
Demo地址:https://play.google.com/store/apps/details?id=com.mrengineer13.snackbar.sample
效果图:HeadsUp
在2.3上使用 android 5.0的 HeadsUp 效果
项目地址:https://github.com/zzz40500/HeadsUp
效果图:
十二、FlipView
android-flip
类似Flipboard翻转动画的实现
项目地址:https://github.com/openaphid/android-flip
Demo地址:https://github.com/openaphid/android-flip/blob/master/FlipView/Demo/APK/Aphid-FlipView-Demo.apk?raw=true
APP示例:flipboardFlipImageView
支持x、y、z及动画选择的翻转动画的实现
项目地址:https://github.com/castorflex/FlipImageView
Demo地址:https://play.google.com/store/apps/details?id=fr.castorflex.android.flipimageviewFoldableLayout
Flip翻转效果的ListView,目前还不支持ListView缓存
项目地址:https://github.com/alexvasilkov/FoldableLayout
Demo地址:http://play.google.com/store/apps/details?id=com.alexvasilkov.foldablelayout.sample
十三、ColorPickView
ColorPickerView
颜色选择器,支持PopupWindows或新的Activity中打开
项目地址:https://code.google.com/p/color-picker-view/
效果图:HoloColorPicker
颜色选择器
项目地址:https://github.com/LarsWerkman/HoloColorPicker
Demo地址:https://docs.google.com/file/d/0BwclyDTlLrdXRzVnTGJvTlRfU2s/editColorPickerPreference
颜色选择器
项目地址:https://github.com/attenzione/android-ColorPickerPreference
效果图:ColorPicker
颜色选择器(Google Agenda中的样式风格)
项目地址:https://github.com/flavienlaurent/colorpicker
Demo地址:https://raw.github.com/biboune/colorpicker/master/colorpicker-sample.apk
效果图:
十四、GraphView
-
MPAndroidChart
强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、网状图及各种图的结合;支持图的拖拽缩放;支持 Android 2.2 以上,支持横纵轴缩放,多指缩放,展现动画、高亮、保存到 sdcard、从文件读取图表
项目地址:https://github.com/PhilJay/MPAndroidChart
Demo地址:https://play.google.com/store/apps/details?id=com.xxmassdeveloper.mpchartexample
Demo项目:https://github.com/PhilJay/MPAndroidChart/tree/master/MPChartExample
效果图: achartengine
强大的图表绘制工具,支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合
项目地址:https://code.google.com/p/achartengine/
效果图:
http://www.achartengine.org/dimages/sales_line_and_area_chart.png
http://www.achartengine.org/dimages/temperature_range_chart.png
http://www.achartengine.org/dimages/combined_chart.png
http://www.achartengine.org/dimages/budget_chart.png
官网网址:http://www.achartengine.org/
APP示例:Wordpress Android,Google AnalyticsGraphView
绘制图表和曲线图的View,可用于Android上的曲形图、柱状图、波浪图展示
项目地址:https://github.com/jjoe64/GraphView
Demo项目:https://github.com/jjoe64/GraphView-Demos
APP示例:Wordpress Android,Google AnalyticsHoloGraphLibrary
绘制现状图、柱状图、饼状图
项目地址:https://bitbucket.org/danielnadeau/holographlibrary/src
文档介绍:https://bitbucket.org/danielnadeau/holographlibrary/wiki/HomeXCL-Charts
XCL-Charts基于原生的Canvas来绘制各种图表,在设计时,尽量在保证开发效率的同时,给使用者提供足够多的定制化能力。因此使用简便,同时具有相当灵活的定制能力。目前支持3D/非3D柱形图(Bar Chart)、3D/非3D饼图(Pie Chart)、堆积图(Stacked Bar Chart)、面积图(Area Chart)、 折线图(Line Chart)、曲线图(Spline Chart)、环形图(Dount Chart)、南丁格尔玫瑰图(Rose Chart)、仪表盘(Dial Chart)、刻度盘(Gauge Chart)、雷达图(Radar Chart)、圆形图(Circle Chart)等图表。其它特性还包括支持图表缩放、手势移动、动画显示效果、高密度柱形显示、图表分界定制线、多图表的混合显示及同数据源不同类型图表切换等。
项目地址:https://github.com/xcltapestry/XCL-Charts
Demo地址:https://github.com/xcltapestry/XCL-Charts/blob/master/XCL-Charts-demo/bin/XCL-Charts-demo.apk?raw=trueEazeGraph
Android 图表库,支持柱状图、分层柱状图、饼状图、线性图
项目地址:https://github.com/blackfizz/EazeGraph
Demo地址:https://play.google.com/store/apps/details?id=org.eazegraph.appWilliamChart
绘制图表的库,支持LineChartView、BarChartView和StackBarChartView三中图表类型,并且支持 Android 2.2及以上的系统。
项目地址:https://github.com/diogobernardino/WilliamChart
Demo地址:https://play.google.com/store/apps/details?id=com.db.williamchartdemo
Demo项目:https://github.com/diogobernardino/WilliamChart/tree/master/sample
效果图:HelloCharts for Android
支持折线图、柱状图、饼图、气泡图、组合图;支持预览、放大缩小,滚动,部分图表支持动画;支持 Android 2.2 以上
项目地址:https://github.com/lecho/hellocharts-android
Demo地址:https://play.google.com/store/apps/details?id=lecho.lib.hellocharts.samples
在线演示:https://www.youtube.com/watch?v=xbSBjyjH2SY
十五、UI Style
不同样式的系统UI风格,如IOS、Bootstrap风格
UITableView
ios风格控件,包括Button、ListView、TableView
项目地址:https://github.com/thiagolocatelli/android-uitableview
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/ui-tableview-demo.apk?raw=trueATableView
ios风格控件
项目地址:https://github.com/dmacosta/ATableView
Demo地址:https://play.google.com/store/apps/details?id=com.nakardo.atableview.demoCards-UI
卡片式View,支持单个卡片,item为卡片的ListView
项目地址:https://github.com/afollestad/Cards-UI
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/cards-ui-demo.apk?raw=truecardslib
卡片式View,支持单个卡片,item为卡片的ListView和GridView
项目地址:https://github.com/gabrielemariotti/cardslib
Demo地址:https://play.google.com/store/apps/details?id=it.gmariotti.cardslib.demoAndroid-Bootstrap
Bootstrap 风格的按钮
项目地址:https://github.com/Bearded-Hen/Android-Bootstrap
效果图:Material Design Android Library
Android L 中 Material Design 风格的组件适配到 Android 2.2+
项目地址:https://github.com/navasmdc/MaterialDesignLibraryAndroid FlatUI
Android 扁平化风格的组件,支持一些自定义样式
项目地址:https://github.com/eluleci/FlatUI
效果图:
十六、其他
SwipeBackLayout
左右或向上滑动返回的Activity
项目地址:https://github.com/Issacw0ng/SwipeBackLayout
Demo地址:https://play.google.com/store/apps/details?id=me.imid.swipebacklayout.demo
APP示例:知乎android-styled-dialogs
可自定义样式的dialog,默认与Holo主题样式一致,在Android2.2以上同一样式
项目地址:https://github.com/inmite/android-styled-dialogs
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/styled-dialogs-demo.apk?raw=trueAndroid Sliding Up Panel
可拖动的View,能在当前Activity上扶起一个可拖动的Panel
项目地址:https://github.com/umano/AndroidSlidingUpPanel
Demo地址:https://play.google.com/store/apps/details?id=com.sothree.umano
APP示例:Google Music精简播放栏AndroidWheel
Android Wheel支持城市、多种日期时间、密码、图片
项目地址:https://code.google.com/p/android-wheel/
效果图:TableFixHeaders
第一列固定的Table
项目地址:https://github.com/InQBarna/TableFixHeaders
Demo地址:http://bit.ly/13buAIqInscription
可用于展示应用change和new feature信息
项目地址:https://github.com/MartinvanZ/InscriptionActivityTransition
Activity切换动画,包括渐变、flip、某个位置进入等等
项目地址:https://github.com/ophilbert/ActivityTransition
效果图:类似桌面左右切换的各种效果,不过桌面并非用ViewPager实现而已
文档介绍:https://github.com/jfeinstein10/JazzyViewPager/blob/master/JazzyViewPager.apk?raw=trueEasyAndroidAnimations
针对View的各种动画
项目地址:https://github.com/2359media/EasyAndroidAnimationsGlowPadBackport
将Android4.2的锁屏界面解锁扩展到Android1.6及1.6+
项目地址:https://github.com/rock3r/GlowPadBackport
Demo地址:https://play.google.com/store/apps/details?id=net.sebastianopoggi.samples.ui.GlowPadSample
效果图:GlowPadView
Android4锁屏界面解锁
项目地址:https://github.com/nadavfima/GlowPadView
效果图:https://raw.github.com/nadavfima/GlowPadView/master/example.pngandroid-lockpattern
Android的图案密码解锁
项目地址:https://code.google.com/p/android-lockpattern/
Demo地址:https://play.google.com/store/apps/details?id=group.pals.android.lib.ui.lockpattern.demo
文档介绍:https://code.google.com/p/android-lockpattern/wiki/QuickUse
APP示例:Android开机的图案密码解锁,支付宝的密码解锁PatternLock
另一个 Android 图案解锁库
项目地址:https://github.com/DreaminginCodeZH/PatternLock
Demo 地址:https://github.com/DreaminginCodeZH/PatternLock/raw/master/dist/sample.apk
效果图:
APP示例:Android开机的图案密码解锁,支付宝的密码解锁RangeBar
类似于SeekBar,不同的是可以选择一个范围内的值而不是单个值
项目地址:https://github.com/edmodo/range-bar
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/range-bar-demo.apk?raw=true
效果图:ChromeView
利用Chromium实现的WebView,解决各个Android版本WebView不同的问题,同时利用最新Chrome代码
项目地址:https://github.com/pwnall/chromeviewandroid-phased-seek-bar
支持预先定义状态的SeekBar
项目地址:https://github.com/ademar111190/android-phased-seek-bar
效果图:Android Slider Preference Library
可添加到设置中的基于对话框的RankBar小部件
项目地址:https://github.com/jayschwa/AndroidSliderPreferenceShowcaseView library
用于高亮显示应用程序的特定部分,从而突出突出重点
项目地址:https://github.com/amlcurran/ShowcaseViewandroid-segmented-control
Android上的Segmented Controls,相当于RadioButton组
项目地址:https://github.com/hoang8f/android-segmented-controlSwipeable Cards
类似Tinder的卡片效果,可以加载图片并动画效果展示,向左滑动表示喜欢,向右表示不喜欢
项目地址:https://github.com/kikoso/Swipeable-Cards
Demo地址:https://play.google.com/store/apps/details?id=info.hoang8f.fbutton.demoEdgeEffectOverride
改变ScrollView, ListView, ExpandableListView, GridView, ViewPager等滚动控件滚动到边缘的颜色效果
项目地址:https://github.com/AndroidAlliance/EdgeEffectOverrideandroid-pinned-header-listviews
使ExpandListView的Group滑动到顶端时会固定不动直到另外一个Group到达顶端
项目地址:https://github.com/rtyley/android-pinned-header-listviewsAndroidSwipeLayout
滑动Layout,支持单个View,ListView,GridView
项目地址:https://github.com/daimajia/AndroidSwipeLayout
Demo地址:Download Demo
效果图:DynamicCardLayout
在Android中实现的类似Windows8的瓷片布局
项目地址:https://github.com/dodola/DynamicCardLayout
效果图:Emoticons-Keyboard
带表情情符号的自定义键盘
项目地址:https://github.com/chiragjain/Emoticons-Keyboard
效果图:Android Typeface Helper
可以帮你轻松实现自定义字体的库
项目地址:https://github.com/norbsoft/android-typeface-helper
效果图:Android-Anim-Playground
几个动画效果,其中第二个基于android-svg的绘制效果非常好
项目地址:https://github.com/Tibolte/Android-Anim-Playground
效果图:NiftyDialogEffects
支持自定义飞入动画样式的 Dialog
项目地址:https://github.com/sd6352051/NiftyDialogEffects
效果图:
在线演示:http://tympanus.net/Development/ModalWindowEffects/PostOffice
创建 Holo 及 Material Design 样式的 Dialog
项目地址:https://github.com/r0adkll/PostOffice
效果图:Swipecards
类似Tinder的卡片效果,可以加载图片并动画效果展示,向左滑动表示喜欢,向右表示不喜欢,根据 Kikoso's Swipeable-Cards 改造而来
项目地址:https://github.com/Diolor/SwipecardsSeekArc
圆形的 SeekBar
项目地址:https://github.com/TriggerTrap/SeekArc
效果图:BlurDialogFragment
显示 DialogFragment 时背景模糊效果
项目地址:https://github.com/tvbarthel/BlurDialogFragment
Demo地址:https://play.google.com/store/apps/details?id=fr.tvbarthel.lib.blurdialogfragment.samplerange-seek-bar
随机值选取的 SeekBar
项目地址:https://github.com/yahoo/android-range-seek-bar
效果图:MaterialRangeBar
可以选择一个范围内的值而不是单个值的 SeekBar,RangeBar 的 Material Design 风格适配
项目地址:https://github.com/oli107/material-range-bar
效果图:MaterialList
Material Design 风格的 CardView
项目地址:https://github.com/dexafree/MaterialList
Demo地址:https://play.google.com/store/apps/details?id=com.dexafree.materiallistviewexample
效果图:road-trip
设置path的各种动画效果,以及如何实现复杂路径动画,类似于ios中的指纹注册界面的指纹动画效果
项目地址:https://github.com/romainguy/road-trip
效果图:dialogplus
一个简单的Android对话框,支持不同的弹出模式
项目地址:https://github.com/orhanobut/dialogplus
效果图:FlowLayout
一个简单的流式布局,用法类似 LinearLayout,但是能够让子元素根据宽度自动换行
项目地址:FLowLayout
效果图:
第二部分 工具库
主要包括那些不错的开发库,包括依赖注入框架、图片缓存、网络相关、数据库ORM建模、Android公共库、Android 高版本向低版本兼容、多媒体相关及其他。
一、依赖注入DI
通过依赖注入减少View、服务、资源简化初始化,事件绑定等重复繁琐工作
AndroidAnnotations(Code Diet)
android快速开发框架
项目地址:https://github.com/excilys/androidannotations
文档介绍:https://github.com/excilys/androidannotations/wiki
官网网址:http://androidannotations.org/
特点:(1) 依赖注入:包括view,extras,系统服务,资源等等
(2) 简单的线程模型,通过annotation表示方法运行在ui线程还是后台线程
(3) 事件绑定:通过annotation表示view的响应事件,不用在写内部类
(4) REST客户端:定义客户端接口,自动生成REST请求的实现
(5) 没有你想象的复杂:AndroidAnnotations只是在在编译时生成相应子类
(6) 不影响应用性能:仅50kb,在编译时完成,不会对运行时有性能影响。
PS:与roboguice的比较:roboguice通过运行时读取annotations进行反射,所以可能影响应用性能,而AndroidAnnotations在编译时生成子类,所以对性能没有影响roboguice
帮你处理了很多代码异常,利用annotation使得更少的代码完成项目
项目地址:https://github.com/roboguice/roboguice
文档介绍:https://github.com/roboguice/roboguice/wikibutterknife
利用annotation帮你快速完成View的初始化,减少代码
项目地址:https://github.com/JakeWharton/butterknife
文档介绍:http://jakewharton.github.io/butterknife/Dagger
依赖注入,适用于Android和Java
项目地址:https://github.com/square/dagger
文档介绍:http://square.github.io/dagger/
二、图片缓存
Android-Universal-Image-Loader
图片缓存,目前使用最广泛的图片缓存,支持主流图片缓存的绝大多数特性。
项目地址:https://github.com/nostra13/Android-Universal-Image-Loader
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/universal-imageloader-demo.apk?raw=true
文档介绍:http://www.intexsoft.com/blog/item/74-universal-image-loader-part-3.htmlpicasso
square开源的图片缓存
项目地址:https://github.com/square/picasso
文档介绍:http://square.github.io/picasso/
特点:(1)可以自动检测adapter的重用并取消之前的下载
(2)图片变换
(3)可以加载本地资源
(4)可以设置占位资源
(5)支持debug模式ImageCache
图片缓存,包含内存和Sdcard缓存
项目地址:https://github.com/Trinea/AndroidCommon
Demo地址:https://play.google.com/store/apps/details?id=cn.trinea.android.demo
文档介绍:http://www.trinea.cn/android/android-imagecache/
特点:(1)支持预取新图片,支持等待队列
(2)包含二级缓存,可自定义文件名保存规则
(3)可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法
(4)可方便的保存及初始化恢复数据
(5)支持不同类型网络处理
(6)可根据系统配置初始化缓存等Cube ImageLoader
阿里巴巴一淘使用的图片加载,综合了Android-Universal-Image-Loader 和 square 等组件优点,简单易用,良好的中文文档支持
项目地址:https://github.com/etao-open-source/cube-sdk
Demo地址:https://github.com/liaohuqiu/cube-sdk/raw/master/cube-sdk-sample.apk
效果图:文档介绍:http://cube-sdk.liaohuqiu.net/fresco
一款强大的图片缓存工具,由 Facebook开发
项目地址:https://github.com/facebook/fresco
文档介绍:http://frescolib.org/
特点:(1) 两个内存缓存加上磁盘缓存构成了三级缓存
(2) 支持流式,可以类似网页上模糊渐进式显示图片
(3) 对多帧动画图片支持更好,如 Gif、WebP
(4) 更多样的显示,如圆角、进度条、点击重试、自定义对焦点
(5) 更多样的加载,如支持 EXIF、全面支持 WebP
(6) 支持 Android 2.3+
三、网络相关
Asynchronous Http Client for Android
Android异步Http请求
项目地址:https://github.com/loopj/android-async-http
文档介绍:http://loopj.com/android-async-http/
特点:(1) 在匿名回调中处理请求结果
(2) 在UI线程外进行http请求
(3) 文件断点上传
(4) 智能重试
(5) 默认gzip压缩
(6) 支持解析成Json格式
(7) 可将Cookies持久化到SharedPreferencesandroid-query
异步加载,更少代码完成Android加载
项目地址:https://github.com/androidquery/androidquery 或 https://code.google.com/p/android-query/
Demo地址:https://play.google.com/store/apps/details?id=com.androidquery
文档介绍:https://code.google.com/p/android-query/#Why_AQuery?
特点:https://code.google.com/p/android-query/#Why_AQuery?Async Http Client
Java异步Http请求
项目地址:https://github.com/AsyncHttpClient/async-http-client
文档介绍:http://sonatype.github.io/async-http-client/Ion
支持图片、json、http post等异步请求
项目地址:https://github.com/koush/ion
文档介绍:https://github.com/koush/ion#more-examplesHttpCache
Http缓存
项目地址:https://github.com/Trinea/AndroidCommon
Demo地址:https://play.google.com/store/apps/details?id=cn.trinea.android.demo
文档介绍:http://www.trinea.cn/android/android-http-cache
特点是:(1) 根据cache-control、expires缓存http请求
(2) 支持同步、异步Http请求
(3) 在匿名回调中处理请求结果
(4) 在UI线程外进行http请求
(5) 默认gzip压缩Http Request
项目地址:https://github.com/kevinsawicki/http-request
文档介绍:https://github.com/kevinsawicki/http-request#examplesokhttp
square开源的http工具类
项目地址:https://github.com/square/okhttp
文档介绍:http://square.github.io/okhttp/
特点:(1) 支持SPDY( http://zh.wikipedia.org/wiki/SPDY )协议。SPDY协议是Google开发的基于传输控制协议的应用层协议,通过压缩,多路复用(一个TCP链接传送网页和图片等资源)和优先级来缩短加载时间。
(2) 如果SPDY不可用,利用连接池减少请求延迟
(3) Gzip压缩
(4) Response缓存减少不必要的请求Retrofit
RESTFUL API设计
项目地址:https://github.com/square/retrofit
文档介绍:http://square.github.io/retrofit/RoboSpice
Android异步网络请求工具,支持缓存、REST等等
项目地址:https://github.com/stephanenicolas/robospice
Demo地址:https://github.com/stephanenicolas/RoboDemo/downloadsDroppy
支持多种样式的下拉菜单
项目地址:https://github.com/shehabic/Droppy
四、数据库 orm工具包
orm的db工具类,简化建表、查询、更新、插入、事务、索引的操作
greenDAO
Android Sqlite orm的db工具类
项目地址:https://github.com/greenrobot/greenDAO
文档介绍:http://greendao-orm.com/documentation/
官网网址:http://greendao-orm.com/
特点:(1) 性能佳
(2) 简单易用的API
(3) 内存小好小
(4) 库大小小ActiveAndroid
Android Sqlite orm的db工具类
项目地址:https://github.com/pardom/ActiveAndroid
文档介绍:https://github.com/pardom/ActiveAndroid/wiki/_pagesSprinkles
Android Sqlite orm的db工具类,比较显著的特点就是配合 https://github.com/square/retrofit 能保存从服务器获取的数据
项目地址:https://github.com/emilsjolander/sprinkles
文档介绍:http://emilsjolander.github.io/blog/2013/12/18/android-with-sprinkles/Realm
移动端的数据库,适用于 Phone、Tablet、Wearable,支持 ORM,线程安全、支持连表及数据库加密,比 SQLite 性能更好
项目地址:https://github.com/realm/realm-java
文档介绍:http://realm.io/docs/java/0.72.0/ormlite-android
项目地址:https://github.com/j256/ormlite-android
文档介绍:http://ormlite.com/sqlite_java_android_orm.shtmlSchematic
根据SQLite生成ContentProvider
项目地址:https://github.com/SimonVT/schematicDBFlow
Android SQLite ORM工具库。综合了 Active Android, Schematic, Ollie,Sprinkles等库的优点;通过注解实现,性能好;能生成ContentProvider。
项目地址:https://github.com/Raizlabs/DBFlow
文档介绍:https://github.com/Raizlabs/DBFlow#usage-docs
五、Android公共库
Guava
Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O等等. 这些高质量的API可以使你的JAVa代码更加优雅,更加简洁
项目地址:https://code.google.com/p/guava-libraries/
文档介绍:https://code.google.com/p/guava-libraries/wiki/GuavaExplainedVolley
Google提供的网络通信库,使得网络请求更简单、更快速
项目地址:https://android.googlesource.com/platform/frameworks/volley
文档介绍:http://commondatastorage.googleapis.com/io-2013/presentations/110%20-%20Volley-%20Easy,%20Fast%20Networking%20for%20Android.pdfAndroidCommon
Android公共库
项目地址:https://github.com/Trinea/AndroidCommon
Demo地址:https://play.google.com/store/apps/details?id=cn.trinea.android.demo
文档介绍:http://www.trinea.cn/android/android-common-lib/
包括:(1)缓存(图片缓存、预取缓存、网络缓存)
(2) 公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)
(3) Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)shipfaster
整合了Dagger Otto Retrofit Robolectric Picasso OkHttp,方便快速开发
项目地址:https://github.com/pyricau/shipfasterCleanAndroidCode
整合了Dagger Otto AndroidAnnotations,方便快速开发
项目地址:https://github.com/pyricau/CleanAndroidCodexUtils
基于Afinal,包含DbUtils、ViewUtils、HttpUtils、BitmapUtils四大模块,可用于快速开发
项目地址:https://github.com/wyouflf/xUtilsAfinal
Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据
项目地址:https://github.com/yangfuhai/afinal
官网网址:http://www.afinal.orgUltimateAndroid
UltimateAndroid是一个快速开发Android应用的框架,框架目前主要包含的功能有View Injection,ORM,异步网络请求和图片加载,自动化脚本测试,磁盘LRU等功能.同时提供了类似于TripleDes、Webview快速设置、Md5处理、String处理,Https处理等常用工具类,还有超过100多种UI控件效果。
项目地址:https://github.com/cymcsg/UltimateAndroid
官网网址:http://blog.marshalchen.com/UltimateAndroid/SAF
SAF(Simple Android Framework)是一个简单的android框架,它为开发Android app提供了基础性组件。
项目地址:https://github.com/fengzhizi715/SAF
官网网址:http://www.salesuite.cn/
包括:(1)Event Bus(事件总线)
(2) Rest Client(http的框架)
(3) Image Cache(图片缓存)
(4) Dependency Injection(依赖注入)
(5) Sqlite ORM(sqlite的orm)
(6) Router(Activity、Fragment的Router)
(7) Utils(各种常用的工具类)Barber
Custom View 神器。通过简单的注解帮助你大大减少 Custom View 中的代码量。由于和 ButterKnife 一样使用了 Annotation Proccessor ,所以对程序性能没有影响。
项目地址:https://github.com/hzsweers/barberdevice-year-class
A library that analyzes an Android device's specifications and calculates which year the device would be considered "high end”.(facebook开发的检测手机主流配置工具)
项目地址:https://github.com/facebook/device-year-class
六、Android 高版本向低版本兼容
ActionBarSherlock
为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题
项目地址:https://github.com/JakeWharton/ActionBarSherlock
Demo地址:https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos
APP示例:太多了。。现在连google都在用Nine Old Androids
将Android 3.0(Honeycomb)所有动画API(ObjectAnimator ValueAnimator等)兼容到Android1.0
项目地址:https://github.com/JakeWharton/NineOldAndroids
Demo地址:https://play.google.com/store/apps/details?id=com.jakewharton.nineoldandroids.sample
文档介绍:http://nineoldandroids.com/HoloEverywhere
将Android 3.0的Holo主题兼容到Android2.1++
项目地址:https://github.com/Prototik/HoloEverywhere
Demo地址:https://raw.github.com/Prototik/HoloEverywhere/repo/org/holoeverywhere/demo/2.1.0/demo-2.1.0.apk
文档介绍:http://android-developers.blogspot.com/2012/01/holo-everywhere.htmlSherlockNavigationDrawer
将Android NavigationDrawer和ActionbarSherlock结合,解决4.0以下NavigationDrawer的适配问题
项目地址:https://github.com/tobykurien/SherlockNavigationDrawer
文档介绍:http://developer.android.com/training/implementing-navigation/nav-drawer.htmlNotifications4EveryWhere
将Android 4.1的Notification兼容到Android2.2++
项目地址:https://github.com/youxiachai/Notifications4EveryWhereAndroid Switch Widget Backport
将Android Switch和SwitchPreference的兼容到Android2.1++
项目地址:https://github.com/BoD/android-switch-backport
Demo地址:https://play.google.com/store/apps/details?id=org.jraf.android.backport.switchwidget.sample
文档介绍:https://github.com/BoD/android-switch-backport#using-the-switchandroid-datepicker
将Android 4.0的datepicker兼容到Android2.2++
项目地址:https://github.com/SimonVT/android-datepickerGlowPadBackport
Android 4.2的GlowPadView向后适配到API4以上
项目地址:https://github.com/frakbot/GlowPadBackportTransitions Everywhere
Android 4.4 的 Transitions API 兼容到 Android 2.2 以上
项目地址:https://github.com/andkulikov/transitions-everywhere
七、多媒体相关
cocos2d-x
跨平台的2d游戏框架,支持Android、IOS、Linux、Windows等众多平台
项目地址:https://github.com/cocos2d/cocos2d-x
文档介绍:http://www.cocos2d-x.org/wiki
官网网址:http://www.cocos2d-x.org/Vitamio
是一款Android与iOS平台上的全能多媒体开发框架
项目地址:https://github.com/yixia/VitamioBundle
网站介绍:http://www.vitamio.org/docs/
特点:(1) 全面支持硬件解码与GPU渲染
(2) 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频
(3) 在Android与iOS上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8)等常见的多种视频流媒体协议,包括点播与直播。PhotoProcessing
利用ndk处理图片库,支持Instafix、Ansel、Testino、XPro、Retro、BW、Sepia、Cyano、Georgia、Sahara、HDR、Rotate(旋转)、Flip(翻转)等各种特效
项目地址:https://github.com/lightbox/PhotoProcessing
Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/photo-processing.apk?raw=trueAndroid StackBlur
图片模糊效果工具类
项目地址:https://github.com/kikoso/android-stackblur
Demo地址:https://github.com/kikoso/android-stackblur/blob/master/StackBlurDemo/bin/StackBlurDemo.apk?raw=true
文档介绍:https://github.com/kikoso/android-stackblur#usageBitmap Smart Clipping using OpenCV
图片智能裁剪保留重要部分显示
项目地址:https://github.com/beartung/tclip-android
利用淘宝的 http://code.taobao.org/p/tclip/ 库完成
一淘玩客正在使用的图片裁剪,自动识别图片中的重要区域,并且在图片裁剪时保留重要区域
特点:(1). 能进行人脸识别。图片中有人脸,将自动视为人脸区域为重要区域,将不会被裁剪掉
(2).自动其它重要区域。如果图片中未识别出人脸,则会根据特征分布计算出重区域Cropper
图片局部剪切工具,可触摸控制选择区域或旋转
项目地址:https://github.com/edmodo/cropper
效果图:
文档介绍:https://github.com/edmodo/cropper/wikiandroid-crop
图片裁剪Activity
项目地址:https://github.com/jdamcd/android-crop
效果图:TileView
可分块显示大图,支持2D拖动、双击、双指放大、双指捏合
项目地址:https://github.com/moagrius/TileView
Demo地址:http://moagrius.github.io/TileView/TileViewDemo.apkBlurEffectForAndroidDesign
图片模糊效果
项目地址:https://github.com/PomepuyN/BlurEffectForAndroidDesignandroid-eye
PC端网页查看同一局域网内的手机摄像头内容,可以用来监控哦
项目地址:https://github.com/Teaonly/android-eye
Demo地址:https://play.google.com/store/apps/details?id=teaonly.droideyelibpng for Android
PNG图片的jni库,支持几乎png的所有特性
项目地址:https://github.com/julienr/libpng-android
文档介绍:http://www.libpng.org/pub/png/libpng.htmlandroid-gpuimage
基于GPU的图片滤镜
项目地址:https://github.com/CyberAgent/android-gpuimageAndroidFaceCropper
图片脸部自动识别,将识别后的局部图片返回
项目地址:https://github.com/lafosca/AndroidFaceCropperAndroid Video Crop
利用TextureView播放和剪切视频,类似ImageView.setScaleType
项目地址:https://github.com/dmytrodanylyk/android-video-crop
Demo地址:https://github.com/lafosca/AndroidFaceCropper/releases/download/1.0/FaceCropper-sample-debug-unaligned.apksvg-android
Android Svg矢量图形支持
项目地址:https://github.com/japgolly/svg-android https://github.com/japgolly/svg-androidAndroid Visualizer
从Android MediaPlayer获得音频,然后像iTunes及WinAmp一样展示音轨
项目地址:https://github.com/felixpalmer/android-visualizerExoPlayer
包括仪表板和SmoothStreaming自适应回放,缓存持久化和自定义渲染器,方便自定义和扩展,并且可以通过应用商店更新
项目地址:https://github.com/google/ExoPlayerDanmakuFlameMaster
android上开源弹幕解析绘制引擎项目
项目地址:https://github.com/ctiao/DanmakuFlameMaster
八、事件总线(订阅者模式)
通过发布/订阅事件解耦事件发送和接受,从而简化应用程序组件(Activities, Fragments及后台线程)之间的通信
EventBus
greenrobot的开源项目
项目地址:https://github.com/greenrobot/EventBus
文档介绍:https://github.com/greenrobot/EventBus#general-usage-and-api
特点:(1) 支持在不同类型的线程中处理订阅,包括发布所在线程,UI线程、单一后台线程、异步线程
(2) 支持事件优先级定义,支持优先级高的订阅者取消事件继续传递,支持粘性事件,是不是跟系统的有序广播、粘性广播很像啊
(3) 不是基于annotations
(4) 性能更优
(5) 体积小
(6) 支持单例创建或创建多个对象
(7) 支持根据事件类型订阅Otto
Square的开源项目,基于Guava的Android优化
项目地址:https://github.com/square/otto
文档介绍:http://square.github.io/otto/
EventBus与Otto的功能及性能对比文档
EventBus与Otto性能对比Demo Apk
九、传感器
Great Android Sensing Toolkit
Android感应器工具包,包含示例及使用过程中可能需要的算法
项目地址:https://github.com/gast-lib/gast-lib
Demo地址:https://play.google.com/store/apps/details?id=root.gast.playground
文档介绍:https://github.com/gast-lib/gast-lib#documentationSensorManager
Android传感器管理
项目地址:https://github.com/nlathia/SensorManager
文档介绍:https://docs.google.com/document/d/1TqThJULb-4e6TGb1gdkAaPCfyuXStjJpbnt7a0OZ9OE/editGPSLogger
记录GPS信息
项目地址:https://github.com/mendhak/gpslogger
Demo地址:https://play.google.com/store/apps/details?id=com.mendhak.gpslogger
文档介绍:http://code.mendhak.com/gpslogger/Pedometer
计步器,使用硬件计步感应器
项目地址:https://github.com/j4velin/Pedometerleapcast
ChromeCast模拟器的App
项目地址:https://github.com/dz0ny/leapcastArduino-Communicator
与Arduino通信的App
项目地址:https://github.com/jeppsson/Arduino-Communicatorandroid-pedometer
Android计步器
项目地址:https://github.com/bagilevi/android-pedometer
Demo地址:http://pedometer.googlecode.com/files/Pedometer-1.4.apkOwnTracks for Android
自己的轨迹记录
项目地址:https://github.com/owntracks/androidShake Detector library for Android
Android手机震动摇晃检测库,提供供UI线程调用的回调接口
项目地址:https://github.com/tbouron/ShakeDetector
Demo地址:https://play.google.com/store/apps/details?id=com.github.tbouron.shakedetector.exampleAndroid heart rate monitor
Android心跳检测
项目地址:https://github.com/phishman3579/android-heart-rate-monitorBluetooth LE Library for Android
蓝牙源信息,包括宝库Mac、更新时间、RSSI、UUID、信号源距离、影响范围等信息
项目地址:https://github.com/alt236/Bluetooth-LE-Library---Android
Demo地址:https://play.google.com/store/apps/details?id=uk.co.alt236.btlescanfarebot
通过NFC 从公交卡中读取数据的一个应用
项目地址:https://github.com/codebutler/farebot
十、安全
SQLCipher
Sqlite加密工具
项目地址:https://github.com/sqlcipher/sqlcipher
文档介绍:http://sqlcipher.net/sqlcipher-for-android/Conceal
快速高效的进行文件加密解密
项目地址:https://github.com/facebook/conceal
文档介绍:https://github.com/facebook/conceal#usageAndroid-PasscodeLock
应用锁,每次启动或从任何Activity启动应用都需要输入四位数字的密码方可进入
项目地址:https://github.com/wordpress-mobile/Android-PasscodeLock
Demo地址:https://play.google.com/store/apps/details?id=org.wordpress.android
APP示例:Wordpress Android,支付宝,挖财GlowPadBackport
将Android4.2的锁屏界面解锁扩展到Android1.6及1.6+
项目地址:https://github.com/rock3r/GlowPadBackport
Demo地址:https://play.google.com/store/apps/details?id=net.sebastianopoggi.samples.ui.GlowPadSample
效果图:GlowPadView
Android 4锁屏界面解锁
项目地址:https://github.com/nadavfima/GlowPadView
效果图:https://raw.github.com/nadavfima/GlowPadView/master/example.pngandroid-lockpattern
Android的图案密码解锁
项目地址:https://code.google.com/p/android-lockpattern/
Demo地址:https://play.google.com/store/apps/details?id=group.pals.android.lib.ui.lockpattern.demo
文档介绍:https://code.google.com/p/android-lockpattern/wiki/QuickUseAndroid-InsecureBank
关于 Android 不安全性的示例
项目地址:https://github.com/dineshshetty/Android-InsecureBankv2
十一、插件化
更多见:Android 插件化作用、概念以及不错的资料(包括开源项目)和解决方案
dynamic-load-apk
Android 动态加载Apk,热部署,利用 ClassLoader 以及 Activity 代理的方式解决
项目地址:https://github.com/singwhatiwanna/dynamic-load-apk
文档介绍:http://blog.csdn.net/singwhatiwanna/article/details/22597587Android Dynamic Loader
点评的实现方式,和上面不同的是:他不是用代理 Activity 的方式实现而是用 Fragment 以及 Schema 的方式实现
项目地址:https://github.com/mmin18/AndroidDynamicLoader
Demo地址:https://github.com/mmin18/AndroidDynamicLoader/raw/master/host.apkxCombine
Android App插件式插件开发,插件必须先安装,更推荐看上面两个开源项目
项目地址:https://github.com/wyouflf/xCombine
文档介绍:http://my.oschina.net/u/1171837/blog/155377Android Plugin Framework
Android插件式开发,开放的源码目前不完整
项目地址:https://github.com/umeng/apfmultidex
安装多 dex 的 classloader
项目地址:https://github.com/casidiablo/multidexANR-WatchDog
Android ANR 监听,通过监听自己的 UI Thread 是否被执行确定是否发生了 ANR,并可以设置相关事件
项目地址:https://github.com/SalomonBrys/ANR-WatchDog
十二、文件
对不同文档类型的处理,包括PDF、Word、EPub、Html、Zip等
purePDF
允许从任何运行的SWF文件读取和创建PDF文档
项目地址:https://github.com/sephiroth74/purePDFandroid-pdfview
快速解析pdf的view,默认支持手势缩放和相关动画
项目地址:https://github.com/JoanZapata/android-pdfviewOffice 365 SDK for Android Preview
可支持Microsoft SharePoint Lists, Microsoft SharePoint Files, Microsoft Exchange Calendar, Microsoft Exchange Contacts, Microsoft Exchange Mail
项目地址:https://github.com/OfficeDev/Office-365-SDK-for-AndroidOpenSpritz-Android
EPub阅读器
项目地址:https://github.com/OnlyInAmerica/OpenSpritz-Androidjsoup
一个解析html的java库,可方便的提取和操作数据
项目地址:https://github.com/jhy/jsoup
官网网址:http://jsoup.org/
作用:(1) 从一个url、文件或string获得html并解析
(2) 利用dom遍历或css选择器查找、提取数据
(3) 操作html元素
(4) 根据白名单去除用于提交的非法数据防止xss攻击
(5) 输出整齐的htmlZIP
java压缩和解压库
项目地址:https://github.com/zeroturnaround/zt-zip
文档介绍:https://github.com/zeroturnaround/zt-zip#examples
作用:(1) 解压和压缩,并支持文件夹内递归操作
(2) 支持包含和排除某些元素
(3) 支持重命名元素
(4) 支持遍历zip包内容
(5) 比较两个zip包等功能
十三、其他
Salvage view
带View缓存的Viewpager PagerAdapter,很方便使用
项目地址:https://github.com/JakeWharton/salvageAndroid Priority Job Queue
Android后台任务队列
项目地址:https://github.com/path/android-priority-jobqueue
文档介绍:https://github.com/path/android-priority-jobqueue#getting-startedCobub Razor
开源的mobile行为分析系统,包括web端、android端,支持ios和window phone
项目地址:https://github.com/cobub/razor
Demo地址:http://demo.cobub.com/razor
官网网址:http://dev.cobub.com/Countly
Android移动端数据采集分析系统
项目地址:https://github.com/Countly/countly-sdk-android
官网网址:https://count.ly/aFileChooser
文件选择器,可内嵌到程序中,而无需使用系统或三方文件选择器。
项目地址:https://github.com/iPaulPro/aFileChooserandroidpn
基于xmpp协议的消息推送解决方案,包括服务器端和android端。
项目地址:https://github.com/dannytiehui/androidpnBolts
Android的异步编程模式
项目地址:https://github.com/BoltsFramework/Bolts-Android/
与AsyncTask比较:(1) 使用的是无大小限制的线程池
(2) 任务可组合可级联,防止了代码耦合CastCompanionLibrary-android
使Android程序中更快的接入Google Cast
项目地址:https://github.com/googlecast/CastCompanionLibrary-android
文档介绍:https://developers.google.com/cast/CastVideos-android
从Android设备分享Video通过Google Cast
项目地址:https://github.com/googlecast/CastVideos-android
文档介绍:https://developers.google.com/cast/Uninstall_Statics
Android应用自身被卸载监听及打开浏览器等反馈功能实现
项目地址:https://github.com/sevenler/Uninstall_Statics
文档介绍:http://www.cnblogs.com/zealotrouge/p/3157126.htmlhttp://www.cnblogs.com/zealotrouge/p/3159772.htmlMemento
保证在系统配置改变时,Activity中的某些数据可以简单安全的保持不变
项目地址:https://github.com/mttkay/memento
文档介绍:https://github.com/mttkay/memento#usageFreeFlow
布局引擎,更简单的创建自定义布局,并且当数据和布局改变时更美观的过渡动画
项目地址:https://github.com/Comcast/FreeFlow
Demo地址:https://github.com/Comcast/FreeFlow/releasesAndroid Gesture Detectors Framework
Android手势框架,支持双指旋转、移动、平移、缩放等
项目地址:https://github.com/Almeros/android-gesture-detectorsMapbox Android SDK
Android Map的替代版
项目地址:https://github.com/mapbox/mapbox-android-sdkActivity animation
Activity跳转动画,支持各个方向波浪的效果
项目地址:https://github.com/flavienlaurent/activityanimation
在线演示:https://www.youtube.com/watch?v=-E0sc6w_JckKryoNet
通过NIO提供客户端和服务器端TCP/UDP网络传输的Java库
项目地址:https://github.com/EsotericSoftware/kryonetRebound
一个模仿弹簧反弹的Java库,可用于创建动画
项目地址:https://github.com/facebook/reboundAndroid Social Networks
社交网络接入统一管理器,可方便的从Twitter, LinkedIn, Facebook, Google Plus登陆、获得个人信息、发送消息、发送专篇、添加或删除好友
项目地址:https://github.com/antonkrasov/AndroidSocialNetworks
Demo地址:https://play.google.com/store/apps/details?id=com.github.androidsocialnetworks.apidemosSmartAppUpdates
Android App 增量升级,包含前后端方案、Demo、以及 so 库,可用于商店或大体积 App 差分升级
项目地址:https://github.com/cundong/SmartAppUpdatesMagnet
创建类似 Facebook 聊天桌面悬浮窗的效果
项目地址:https://github.com/premnirmal/MagnetParceler
通过注解及工具类自动完成实体类 Parcelable及值传递
项目地址:https://github.com/johncarl81/parcelerAcDisplay
将 Android 的通知都集中到锁屏显示
项目地址:https://github.com/AChep/AcDisplay
Demo地址:https://play.google.com/store/apps/details?id=com.achep.acdisplayQrCodeScan
ZXing和ZBar结合的二维码扫描项目,提高了扫描效率
项目地址:https://github.com/SkillCollege/QrCodeScan
效果图:Android-ScreenShot
实现android系统截屏功能
项目地址:https://github.com/Android-ScreenShot/AndroidScreenShotService
文档介绍:http://blog.csdn.net/buptgshengod/article/details/39155979card.io SDK for Android
信用卡扫描 Android SDK
项目地址:https://github.com/card-io/card.io-Android-SDK
Demo项目:https://github.com/card-io/card.io-Android-SDK/tree/master/SampleAppASNE
Twitter, Facebook, Google Plus, LinkedIn, Instagram, Vkontakte, Odnoklassniki 的集成库,包括他们的大多数功能
项目地址:https://github.com/gorbin/ASNE
Demo地址:https://play.google.com/store/apps/details?id=com.gorbin.androidsocialnetworksextended.asneAndroid Signature Pad
Android 自定义的签名 View,可自定义笔颜色和大小
项目地址:https://github.com/gcacace/android-signaturepad
Demo项目:https://github.com/gcacace/android-signaturepad/tree/master/SignaturePad-ExampleTeleport
Android Wear 数据同步和消息传送库
项目地址:https://github.com/Mariuxtheone/TeleportDebugLog
可以帮你创建更简单和更容易理解的调试日志,能够友好的显示调试信息所在类和函数。
项目地址:https://github.com/MustafaFerhan/DebugLog
效果图:Logger
简单、美观而且十分强大的Android日志工具
项目地址:https://github.com/orhanobut/logger
Demo地址:https://github.com/orhanobut/logger/tree/master/app
效果图:
第三部分 优秀项目
主要介绍那些Android还不错的完整项目,目前包含的项目主要依据是项目有意思或项目分层规范比较好。
Linux
项目地址:https://github.com/torvalds/linux
Android
项目地址:https://android.googlesource.com/ 或 https://github.com/android
以上两个项目,不解释
(1) ZXing
二维码扫描工具
项目地址:https://github.com/zxing/zxing 或 https://code.google.com/p/zxing/
APK地址:https://play.google.com/store/apps/details?id=com.google.zxing.client.android
PS:现在市面上很多应用的二维码扫描功能都是从这个修改而来
(2) photup
编辑机批量上传照片到facebook上
项目地址:https://github.com/chrisbanes/photup
APK地址:https://play.google.com/store/apps/details?id=uk.co.senab.photup
PS:代码分包合理,很棒。不过这个项目依赖的开源项目比较多,比较难编译
(3) github-android
Github的Android客户端项目
项目地址:https://github.com/github/android
APK地址:https://play.google.com/store/apps/details?id=com.github.mobile
(4) Notes
MIUI便签
项目地址:https://github.com/MiCode/Notes
APK地址:https://github.com/Trinea/TrineaDownload/blob/master/miui-note-demo.apk?raw=true
PS:项目分包比较合理,相比较miui的文件管理器https://github.com/MiCode/FileExplorer 代码规范较好得多
(5) weicuiyuan
四次元-新浪微博客户端
项目地址:https://github.com/qii/weiciyuan
APK地址:https://play.google.com/store/apps/details?id=org.qii.weiciyuan
(6) gnucash-android
一个记账理财软件
项目地址:https://github.com/codinguser/gnucash-android
APK地址:http://play.google.com/store/apps/details?id=org.gnucash.android
(7) AntennaPod
支持rss订阅、音乐订阅
项目地址:https://github.com/danieloeh/AntennaPod
APK地址:https://play.google.com/store/apps/details?id=de.danoeh.antennapod
(8) ChaseWhisplyProject
打鬼游戏
项目地址:https://github.com/tvbarthel/ChaseWhisplyProject
APK地址:https://play.google.com/store/apps/details?id=fr.tvbarthel.games.chasewhisply
(9) Tweet Lanes
功能完整的Twitter客户端
项目地址:https://github.com/chrislacy/TweetLanes
APK地址:https://play.google.com/store/apps/details?id=com.tweetlanes.android
(10) Financius
简单易用的记账程序
项目地址:https://github.com/mvarnagiris/Financius
APK地址:https://play.google.com/store/apps/details?id=com.code44.finance
(11) todo.txt-android
todo.txt的官方Android应用
项目地址:https://github.com/ginatrapani/todo.txt-android
APK地址:https://play.google.com/store/apps/details?id=com.todotxt.todotxttouch
(12) simpletask
基于todo.txt官方应用的另一个客户端
项目地址:https://github.com/mpcjanssen/simpletask-android
APK地址:https://play.google.com/store/apps/details?id=nl.mpcjanssen.todotxtholo
(13) Muzei Live Wallpaper
定时更换桌面精美壁纸
项目地址:https://github.com/romannurik/muzei
APK地址:https://play.google.com/store/apps/details?id=net.nurik.roman.muzei
(14) Scanbook
扫描搜索查询图书信息
项目地址:https://github.com/JayFang1993/ScanBook
APK地址:http://www.wandoujia.com/apps/com.scanbook
(15) iosched The Google I/O 2014 Android App
项目地址:https://github.com/google/iosched
APK地址:https://play.google.com/store/apps/details?id=com.google.samples.apps.iosched
第四部分 开发工具及测试工具
主要介绍和Android开发工具和测试工具相关的开源项目。
一、开发效率工具
Parceler
通过注解及工具类自动完成实体类 Parcelable及值传递
项目地址:https://github.com/johncarl81/parcelerJson2Java
根据JSon数据自动生成对应的Java实体类,还支持Parcel、Gson Annotations对应代码自动生成。期待后续的提取父类以及多url构建整个工程的功能
项目地址:https://github.com/jonfhancock/JsonToJava
在线演示:http://jsontojava.appspot.com/IntelliJ Plugin for Android Parcelable boilerplate code generation
Android studio插件,生成Parcelable代码
项目地址:https://github.com/mcharmas/android-parcelable-intellij-plugin
效果图:Android Holo Colors IntelliJ Plugin
Android studio插件,生成holo样式9 patch图片
项目地址:https://github.com/jeromevdl/android-holo-colors-idea-plugin
效果图:Android Drawable Factory
用于生成各个分辨率的图片
项目地址:https://github.com/tizionario/AndroidDrawableFactory
效果图:SelectorChapek for Android
Android Studio插件,可根据固定文件名格式资源自动生成drawable selectors xml文件。
项目地址:https://github.com/inmite/android-selector-chapekAndroid Action Bar Style Generator
Android ActionBar样式生成器,可在线选择ActionBar样式自动生成所需要的图片资源及xml文件
项目地址:https://github.com/jgilfelt/android-actionbarstylegenerator
在线演示:http://jgilfelt.github.io/android-actionbarstylegenerator/ButterKnifeZelezny
用于快速生成ButterKnifeView注入代码的Android Studio/IDEA插件
项目地址:https://github.com/inmite/android-butterknife-zeleznyRoboCoP
利用Gradle task根据固定格式的json文件生成ContentProvider
项目地址:https://github.com/mediarain/RoboCoPappiconsizes
用于生成各个分辨率的图片
项目地址:http://www.appiconsizes.com/Gradle Retrolambda Plugin
Retrolambda是将Java8的Lambdas应用于Java7的工具,本项目是Gradle插件,通过Retrolambda从而使Java或Android项目用Java8的Lambdas编写,将编译后的字节码转换为Java6和7的字节码从而正常运行
项目地址:https://github.com/evant/gradle-retrolambdaDagger IntelliJ Plugin
dagger的intellij插件
项目地址:https://github.com/square/dagger-intellij-pluginAndroid Gen Drawable Maven plugin
在编译时根据SVG描述文件生成不同分辨率的jpg、png或点9图片
项目地址:https://github.com/avianey/androidgendrawable-maven-pluginAndroid Asset Studio
各种Android资源自动生成器,包括启动图标、ActionBar图标、通知栏图标、点9等
项目地址:https://github.com/romannurik/AndroidAssetStudio
在线演示:http://romannurik.github.io/AndroidAssetStudio/jsonschema2pojo
根据Json内容生成java对象,支持jackjson和gson
项目地址:https://github.com/joelittlejohn/jsonschema2pojo
在线演示:http://www.jsonschema2pojo.org/9-Patch-Resizer
自动生成 png 及点 9 图片的不同分辨率版本
项目地址:https://github.com/redwarp/9-Patch-ResizerAndroidLocalizationer
可用于将项目中的 string 资源自动翻译为其他语言的 Android Studio/IntelliJ IDEA 插件
项目地址:https://github.com/westlinkin/AndroidLocalizationer
二、开发自测相关
Quality Tools for Android
Android测试及自测工具集合和示例
项目地址:https://github.com/stephanenicolas/Quality-Tools-for-Androidandroid-test-kit
Google的Android测试工具
包括GoogleInstrumentationTestRunner(增强版的InstrumentationTestRunner)和Espresso(用于快速写出可靠测试用例的API)
项目地址:https://code.google.com/p/android-test-kit/
文档介绍:https://code.google.com/p/android-test-kit/w/listrobolectric
测试用例编写框架
项目地址:https://github.com/robolectric/robolectric
Demo地址:https://github.com/robolectric/robolectricsample
文档介绍:http://robolectric.org/
特点:(1). 不需要模拟器在一般JVM就可以运行测试用例
(2). 能完成在真机上的大部分测试包括感应器
其他的测试用例及相关模块Mock可见:android-mock, mockito, easy-mockAndroid FEST
提供一些列方便的断言,可用于提高编写Android自测代码效率
项目地址:https://github.com/square/fest-androidBoundBox
可用于测试类各种访问权限的属性、方法。实际是通过BoundBox这个annotation生成一个属性和方法都是public权限的中间类并对此类进行测试完成的
项目地址:https://github.com/stephanenicolas/boundboxHugo
用于打印函数信息及执行时间的工具,仅在debug模式生效
项目地址:https://github.com/JakeWharton/hugoscalpel
在应用下面添加一层用于界面调试,待详细补充 // TODO
项目地址:https://github.com/JakeWharton/scalpelAndroid Screenshot library
Android截图工具类,用于在持续集成时截图
项目地址:https://github.com/rtyley/android-screenshot-libsonar-android-lint-plugin
将android lint的错误在sonar中展现
项目地址:https://github.com/SonarCommunity/sonar-android
三、测试工具
Spoon
可用于android不同机型设备自动化测试,能将应用apk和测试apk运行在不同机器上并生成相应测试报告。
项目地址:https://github.com/square/spoonTencent APT
APT是腾讯开源的一个Android平台高效性能测试组件,提供丰富实用的功能,适用于开发自测、定位性能瓶颈;测试人员完成性能基准测试、竞品对比测试
项目地址:https://github.com/stormzhang/APTEmmagee
网易开源的性能测试工具,包括CPU、内存、网络流量、启动时间、电池状态等
项目地址:https://github.com/NetEase/EmmageeAndroid py-uiautomator
py-uiautomator是一个对Android uiautomator用python进行封装的测试框架.
项目地址:https://github.com/xiaocong/uiautomatorAugmented Traffic Control
模拟网络状况,包括带宽、时延抖动、丢包率、错包率、包重排率
项目地址:https://github.com/facebook/augmented-traffic-controlstetho
强大的 Android Debug 工具。支持网络请求监控以及数据库查看,可以和 Chrome DevTools 结合或者命令行模式。
项目地址:https://github.com/facebook/stetho
四、开发及编译环境
Buck
facebook开源的Android编译工具,效率是ant的两倍。主要优点在于:
(1) 加快编译速度,通过并行利用多核cpu和跟踪不变资源减少增量编译时间实现
(2) 可以在编译系统中生成编译规则而无须另外的系统生成编译规则文件
(3) 编译同时可生成单元测试结果
(4) 既可用于IDE编译也可用于持续集成编译
(5) facebook持续优化中
项目地址:https://github.com/facebook/buckAndroid Maven Plugin
Android Maven插件,可用于对android三方依赖进行管理。在J2EE开发中,maven是非常成熟的依赖库管理工具,可统一管理依赖库。
项目地址:https://github.com/jayway/maven-android-pluginumeng-muti-channel-build-tool
渠道打包工具
项目地址:https://github.com/umeng/umeng-muti-channel-build-tool
另可参见Google的构建系统Gradle:http://tools.android.com/tech-docs/new-build-system/user-guideGenymotion
目前最好用最快的android模拟器
项目地址:http://www.genymotion.com/
Android studio集成控件: http://plugins.jetbrains.com/plugin/7269?pr=idea
Cyril Mottier推荐:http://cyrilmottier.com/2013/06/27/a-productive-android-development-environment/gradle-mvn-push
方便的将Gradle的Artifacts上传到Maven仓库
项目地址:https://github.com/chrisbanes/gradle-mvn-push
文档介绍:https://github.com/chrisbanes/gradle-mvn-push#usageAndroid Emulator Plugin for Jenkins
Android模拟器 jenkins插件,用于Jenkins做持续集成时跑模拟器测试
项目地址:https://github.com/jenkinsci/android-emulator-pluginAndroid Maven Plugin
管理应用所需要的依赖库。包括的构建工具有Maven、Gradle、ant、sbt
项目地址:https://github.com/mosabua/maven-android-sdk-deployerSDK Manager Plugin
下载和管理Android SDK的Gradle插件
项目地址:https://github.com/JakeWharton/sdk-manager-pluginGradle Protobuf Plugin
将.proto文件转换成Java文件的gradle插件
项目地址:https://github.com/andrewkroh/gradle-protobuf-pluginChromeADB
Chrome 的 Adb 插件,当登录后,能看到所有连接的设备并操作,可以看应用、进程、内存及磁盘使用情况等
项目地址:https://github.com/importre/chromeadb
五、其他
ViewServer
允许app运行在任何手机上都可以用HierarchyViewer查看
项目地址:https://github.com/romainguy/ViewServerGridWichterle for Android
在整个系统上显示一个grid,用来帮助查看应用布局及使得布局更美观,可设置grid网格大小和颜色,android推荐48dp和8dp,可见 Android Design Guidelines – Metrics and Grids,比起hierarchyviewer相差甚远,不过偶尔可用来作为布局查看工具。
项目地址:https://github.com/inmite/android-grid-wichterle
Demo地址:https://play.google.com/store/apps/details?id=eu.inmite.android.gridwichterleCatlog
手机端log查看工具,支持不同颜色显示、关键字过滤、级别过滤、进程id过滤、录制功能等
项目地址:https://github.com/nolanlawson/Catlog
在线演示:https://play.google.com/store/apps/details?id=com.nolanlawson.logcatPID Cat
根据package查看logcat日志
项目地址:https://github.com/JakeWharton/pidcatACRA
应用崩溃信息日志上报到GoogleDoc工具,网页版展现结果三方开源地址https://github.com/BenoitDuffez/crashreportsviewer
项目地址:https://github.com/ACRA/acra
文档介绍:https://github.com/ACRA/acra/wiki/BasicSetupCrashlytics
提供丰富的应用崩溃信息日志收集
轻量级,丰富,可自定义应用崩溃信息收集器,附有邮件通知
项目地址:http://www.crashlytics.com/
集成插件:Android Studio, Eclipse and IntelliJAndroid Resource Navigator
chrome插件,可以方便的查看github上android源码工程的styles.xml和themes.xml。主要功能:
(1) 快速打开android styles.xml themes.xml
(2) 方便在资源间跳转。styles.xml themes.xml文件中资源链接跳转,可以方便跳转到某个资源
(3) 方便查找某个style和theme。chrome地址栏输入arn+tab+搜索内容回车即可
(4) 自动下载不同分辨率下的drawable
(5) 通过映射查找那些不是按照固定命名规则命名的style和theme
项目地址:https://github.com/jgilfelt/android-resource-navigator
在线演示:https://chrome.google.com/webstore/detail/android-resource-navigato/agoomkionjjbejegcejiefodgbckeebo?hl=en&gl=GBandroid-resource-remover
根据lint的提示删除项目中无用的资源,减少包的大小
项目地址:https://github.com/KeepSafe/android-resource-removerTelescope
通过手势截图以特定主题发送到特定邮箱地址报告Bug
项目地址:https://github.com/mattprecious/telescopeComplete Android Fragment & Activity Lifecycle
完整的Android Fragment/Activity生命周期图
项目地址:https://github.com/xxv/android-lifecycleBugsnag Notifier for Android
通过Thread.UncaughtExceptionHandler
捕获应用未处理的异常崩溃 Bug 并用 Notification 展示同时上传到后台服务器
项目地址:https://github.com/bugsnag/bugsnag-android
文档介绍:https://github.com/bugsnag/bugsnag-android#installation--setupMaterial Design Icons
Google Material Design 规范中的 Icon
项目地址:https://github.com/google/material-design-iconsscrollscreenshot
Android 滚动屏幕自动截图 jar 包,支持纵向、横向滚动截屏拼接
项目地址:https://github.com/PGSSoft/scrollscreenshot
效果图:droidicon
1600+的海量Icon,包括750+的Material Design icons
项目地址:https://github.com/theDazzler/droidicon
第五部分
主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神,深挖大神的项目和following,你会发现很多。
一、个人
JakeWharton
就职于Square,绝对牛逼的大神,项目主要集中在Android版本兼容,ViewPager及开发工具上
Github地址:https://github.com/JakeWharton
代表作:ActionBarSherlock,Android-ViewPagerIndicator,Nine Old Androids,SwipeToDismissNOA,hugo,butterknife,Android-DirectionalViewPager, scalpel
pidcat另外对square及其他开源项目有很多贡献
主页:http://jakewharton.com/Chris Banes
Github地址:https://github.com/chrisbanes
代表作:ActionBar-PullToRefresh,PhotoView,Android-BitmapCache,Android-PullToRefresh
主页:http://chris.banes.me/Koushik Dutta
就职于ClockworkMod
Github地址:https://github.com/koush
代表作:Superuser,AndroidAsync,UrlImageViewHelper,ion, 另外对https://github.com/CyanogenMod 的开源项目有很多贡献
主页:http://koush.com/Simon Vig
Github地址:https://github.com/SimonVT
代表作:android-menudrawer,MessageBar
主页:http://simonvt.net/Manuel Peinado
Github地址:https://github.com/ManuelPeinado
代表作:FadingActionBar,GlassActionBar,RefreshActionItem,QuickReturnHeaderEmil Sj?lander
Github地址:https://github.com/emilsjolander
代表作:StickyListHeaders,sprinkles,android-FlipView
主页:http://emilsjolander.se/greenrobot
Github地址:https://github.com/greenrobot
代表作:greenDAO,EventBus
主页:http://greenrobot.de/Jeff Gilfelt
Github地址:https://github.com/jgilfelt
代表作:android-mapviewballoons,android-viewbadger,android-actionbarstylegenerator,android-sqlite-asset-helper
主页:http://jeffgilfelt.comRomain Guy
Android team成员(2013.10已离开Android team,仍在Google)
Github地址:https://github.com/romainguy
代表作:ViewServer
主页:http://www.curious-creature.org/category/android/
個人攝影作品:http://www.flickr.com/photos/romainguysephiroth74
就职于Aviary.com
Github地址:https://github.com/sephiroth74
代表作:ImageViewZoom,HorizontalVariableListView,AndroidWheel,purePDF
主页:http://www.sephiroth.it/Cyril Mottier
Google开发者专家认证,发布一些Android技巧及文章
Github地址:https://github.com/cyrilmottier
代表作:GreenDroid,Polaris
主页:http://cyrilmottier.com/
二、组织
Square
有态度有良心的企业,很多不错的分享
Github地址:https://github.com/square
代表作:okhttp、fest-android,android-times-square、picasso、dagger、spoon等等
主页:http://square.github.io/Inmite s.r.o.
Github地址:https://github.com/inmite
代表作:android-styled-dialogs,android-grid-wichterle,android-selector-chapek
主页:http://www.inmite.eu/
三、博客
License
Copyright 2014 trinea.cn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
7种无须编程的DIY开发工具 你知道几个?
现如今,各种DIY开发工具不断的出现,使得企业和个人在短短几分钟内就能完成应用的创建和发布,大大节省了在时间和资金上的投入。此外,DIY工 具的出现,也帮助广大不具备专业知识和技术的“移动开发粉”创建自己的应用提供了条件。本文从DIY开发工具说起,为广大企业和个人介绍了7款无需学习任 何编程语言,只需运用工具中所提供的各种丰富的功能模块,便可在几分钟内完成创建和发布移动应用的DIY开发工具。
1. Appmakr
Appmakr是一款功能强劲的DIY移动应用开发工具,目前支持iOS、Android和Windows Phone等移动平台。Appmakr可以让用户无需编程就能在分秒钟内创建iOS和Android应用。Appmakr还提供一些其它的功能,包括将网 站连接到应用程序、支持HTML5、推送通知和广告支持。除此之外,用户可以使用自己的开发许可,将应用程序发布到所属的应用商店中。
主要特性:
免费:用户无需付费即可通过应用Appmakr创建想要的应用。如果用户想要获取更多的功能或将应用货币化,可以向Appmakr支付一定的费用。 功能强劲:内置的推送和广告通知、支持Html5、原生高分辨率相册和定位等功能。操作简单:Appmakr为用户提供一个无代码操作环境,让用户可以不 用编写代码就可以在几分钟内创建一个移动应用。跨平台特性:用户可以根据自己的需要*选择所需的开发环境,并且能做到一次编写即可生成多平台支持的应 用。
2. AppsBuilder
AppsBuilder是一款在线跨平台DIY移动开发工具,为用户提供快捷的应用程序解决方案,目前AppsBuilder支持包括iOS、 Windows Phone和Android等在内的多种移动平台。用户所创建的应用程序将会存储到AppsBuilder的云系统中,用户可以实时地更新应用的内容和布 局。除此之外,AppsBuilder还为用户提供强大的推送功能。目前AppsBuilder资费为12美元每月。
主要特性:
操作简单: AppsBuilder为用户提供一个可视化的开发环境,用户无需具备专业知识,即可在分秒钟内快速的创建一个应用程序。功能强 大:AppsBuilder可以方便地创建、设计、编辑和推送本地应用程序,通过简单的“拖拽”操作,来简化移动应用的开发流程,让用户尽情地享受开发的 乐趣。实时的功能预览:AppsBuilder可以为用户提供实时地预览功能,实时的跟踪App的性能。100%的可制定性:用户通过 AppsBuilder可以使用自己的面板,上传自己所喜欢的背景图片和图标来保证100%的可制定布局,瞬间让你的应用独一无二。
3. BuildAnApp
BuildAnApp是一个跨平台DIY开发工具,专为中小型企业、社区团体和专业服务机构打造。目前支持包括iOS、Android和Windows Phone等多种移动平台。BuildAnApp旨在为用户打造一个快捷的移动应用创建和优化的开发环境。
主要特性:
多平台支持:通过使用BuildAnApp,用户可以根据自己的需要*选择所需的开发环境,并能做到一次编写,随处运行。除此之外,用户也可以通 过浏览器来查看用BuildAnApp创建的移动应用。高度的可制定性:BuildAnApp为用户提供了多种自定义的模板,用户无需具备任何编程基础就 可轻松地创建和发布应用程序。操作简单:BuildAnApp独具的快速DIV设计,用户只需要6个步骤即可完成一个应用程序的创建和设计。
4. iBuildApp
iBuildApp是一款免费的跨平台快速DIY移动应用开发平台,截止目前为止,通过iBuildApp创建的移动应用程序已超过35000个。 通过iBuildApp,用户无需编码就可以在几分钟内创建并且发布应用程序。此外,iBuildApp还为客户提供其它的关键功能,包括移动商务、移动 应用程序管理、社交网络和植入广告等功能。
主要特性:
操作简单:通过工具所提供的模板,用户无需专业技能和编程能力就可以在分秒钟内创建和发布应用程序。跨平台特性:支持现有iOS和Android等 主流的移动平台。推送通知:为用户提供推送通知和GPS通知。广告植入功能:允许用户在所创建的应用程序中植入广告。Web服务和数据同步:为用户提供应 用程序、照片、数据等更新功能。其它主要功能:QR码、社区分享和植入小部件等。
5. TheAppBuilder
TheAppBuilder是一款跨平台的DIY移动应用程序开发套件。目前每天有数以万计的用户使用TheAppBuilder来创建和发布应用 程序。通过TheAppBuilder的数据库、“拖拽"功能和在线教程,用户无需具备任何的专业知识和编程能力即可创建自己的应用程序。
主要特性:
免费:TheAppBuilder允许用户免费创建多个应用程序,并且可以免费使用套件的高级功能来创新和尝试新的设计理念。高度的可定制性: 用户通过TheAppBuilder的模板可以轻松地定制应用程序的结构。通过内置的模板和”拖拽“功能,用户可以在几分钟内轻松地创建一个应用程序。跨 平台发布:用户只需要一次创建就可以把应用程序发布到包括iOS、Android、Windows Phone和HTML5等在内的平台上。
6. Attendify
Attendify是一项便捷的应用开发服务。与其它的DIY开发工具一样,Attendify同样提供丰富的内容模板,用户可以根据所提供的模板 快速开发出iOS和Android应用。此外,Attendify还具有应用程序预览功能,帮助用户更好更快地创建并管理应用。
主要特性:
实时预览:Attendify独具的完全引导功能,让用户在创建应用程序的过程中可以实时地预览和管理所创建的应用。快速创建:用户通过 Attendify提供的模板,就可快速地创建App,而无需去掌握任何编程技术。高度DIY:Attendify允许用户*地上传自己的图标、定制自 己的启动画面和应用程序外观,让你的应用立刻脱颖而出。快速推送:一旦用户提交所创建的应用,Attendify会立即将应用发布到App Store和Google Play。
7. AppMachine
AppMachine是一款跨平台的快速开发工具,目前支持iOS和Android两大主流平台。用户可以通过修改AppMachine所提供的 20种应用设计模板来进行App设计。这样一来,没有编程经验的用户也可以通过使用AppMachine来创建App。另外用户也可以自己DIY,添加包 括新闻、LBS、社交媒体、拍照、摄像等多个集成内容。
主要特性:
功能强大:用户可以使用模板组建应用,也可以自主从头进行设计,添加包括新闻、LBS、社交媒体、拍照、摄像等多个集成内容。轻松创建:通过 AppMachine提供的应用模板,用户能够快速的创建独具特色的应用。完全本地化:相对于大多数移动应用DIY产品来说,AppMachine并不依 赖于HTML5,从而实现了真正的完全本地化。实时地测试预览:AppMachine提供AppMachine Previewer功能,让用户能够提前预览他们创建和设计的应用。
AppGyver
AppGyver为移动开发提供了一系列的工具,其中包括了PhoneGap应用Steroids和Prototyper等。Prototyper可以把一些网页组合在一起,开发者可以建立实体模型并与团队成员及客户共同测试创意思路。Steroids允许开发人员利用他们更为熟悉的Web开发技术编写本机移动应用,这种方式比直接使用本机代码简单得多。
Firebase
数据是任何应用的源泉,拥有了Firebase,信息的存储和分享会变得轻松许多。作为一款网络应用实时后台,Firebase帮助用户摆脱管理服务器的麻烦,快速创建应用。在建立项目之后,Firebase可以将建立key value库引发的冲突妥善地处理好,这样用户就可以专注问题本身,节省开发时间,迅速完成应用。
Intel XDK
提起Intel大家想到的都是硬件相关的事情, 但是Intel在今年发布的Intel XDK是一款支持HTML5开发的工具,用户可以通过浏览器来测试自己的项目。最新版Intel XDK的改进包括一个新型拖放界面,该界面可加快新应用程序、原型以及更快速的游戏界面的开发。此外,英特尔还在新版Intel XDK中加入了更强大的开发框架,可根据设备的本机主题开发与之相适应的应用程序。
Appscend
Appscend提供了一个进行跨平台开发工作的云环境,支持用程序的管理、分析及消息推送等功能。Appscend将一个基于模板的设计系统和一个云基础的CMS捆绑在一起,你需要做的就是加一些广告,点几个按钮把结果上传到App Store和Google Play上。
Icenium Mist
Icenium Mist是个基于浏览器的开发环境,开发者可以在任何地方仅通过Web浏览器即可创建应用。Icenium Mist简化了跨平台混合移动应用的开发,它利用了云的能力与灵活性,使用HTML、CSS与JavaScript为iOS与Android设备构建应用。
Parse
Parse是一款基于Baas的后端云存储服务平台,为开发者提供云端数据的存储和读取。Parse提供了一套用于储存数据和推送消息的API。Parse非常的稳定,兼容性和灵活性强,相对于其他Baas平台,Parse在上手方面是最为容易的。
Tabris
如果你是一个Java程序员,可能你会为Android和Blackberry编写程序。有了Tabris,开发者可以像编写Android程序那样用Java编写iOS程序。Java的代码首先在服务器上运行,接着以JSON包的形式将数据发送到Android和iOS上,利用本地的窗口组建将JSON代码进行解译后显示出来。此外,Tabris 基于Eclipse RAP(Rich Ajax Platform),提供了用于构建移动客户端的原生部件。通过本地客户端和服务器端应用的结合,简化了Java开发者的应用开发工作。
Appcelerator Titanium
Titanium应用程序使用HTML,JavaScript和CSS进行开发,并支持PHP、Ruby和Python。应用程序可以使用Appceelerator API访问本地特性,用户界面组件和类似于Analytic的可选模块。Titanium把Jabascript和本地库链接在一起,然后把它编译成字节码。iOS或者Android SDK编译器可以为目标平台构建一个软件包。
Sencha Architect
Sencha Architect构建在该公司的Html5布局工具Ext Designer之上,并扩展了其功能,为桌面与移动Web应用的构建提供更为广泛的应用设计环境。通过联合使用Sencha Touch与Ext JS 4,Sencha Architect旨在提升开发者的生产效率并驱动应用设计模式上的最佳实践。Senchca Architect提供了一个可视化的画布与代码编辑平台,并且使用了拖放的方式,旨在快速实现移动与桌面应用的装配。开发好应用后,开发者就可以通过Sencha Architect打包应用以部署到Web上或是发布到原生的应用商店中。
Corona SDK
专门针对跨平台的Corona SDK涵盖了为iOS、Android、Kindle Fire和Nook设计应用的所有特征,还有一款必不可少的物理引擎。Corona SDK支持硬件加速、GPS、指南针及照相机,支持与Map、Facebook、OpenFient、GameCenter的集成,脚本语言Lua也是易于上手。
一、Afinal框架
项目地址:https://github.com/yangfuhai/afinal
主要有四大模块:
(1) 数据库模块:Android中的orm框架,使用了线程池对sqlite进行操作。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
(3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。
(4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存管理使用lru算法,
没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档),
更好的管理bitmap内存。FinalBitmap可以自定义下载器,用来扩展其他协议显示网络图片,比如ftp等。同时可以自定义bitmap显示器,
在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
二、xUtils框架
项目地址:https://github.com/wyouflf/xUtils
主要有四大模块:
(1) 数据库模块:android中的orm框架,一行代码就可以进行增删改查;
支持事务,默认关闭;
可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
支持绑定外键,保存实体时外键关联实体自动保存或更新;
自动加载外键关联实体,支持延时加载;
支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
(3) 网络模块:支持同步,异步方式的请求;
支持大文件上传,上传大文件不会oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。
(4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
支持加载网络图片和本地图片;
内存管理使用lru算法,更好的管理bitmap内存;
可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...
三、ThinkAndroid
项目地址:https://github.com/white-cat/ThinkAndroid
主要有以下模块:
(1) MVC模块:实现视图与模型的分离。
(2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
(3) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
(4) http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
(5) 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
(6) 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
(7) 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
(8) 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
(9) 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。
(10) 网络状态检测模块:当网络状态改变时,对其进行检
功 能:ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行 Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent的http模块, 具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能, 在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类, 如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具。
优点:功能看起来比较完善。
缺点:这个是white-cat个人写的,从2013年就停止维护了,没有项目文档。
四、LoonAndroid
项目地址:https://github.com/gdpancheng/LoonAndroid
主要有以下模块:
(1) 自动注入框架(只需要继承框架内的application既可)
(2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)
(3) 网络请求模块(继承了基本上现在所有的http请求)
(4) eventbus(集成一个开源的框架)
(5) 验证框架(集成开源框架)
(6) json解析(支持解析成集合或者对象)
(7) 数据库(不知道是哪位写的 忘记了)
(8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)
(9) 自动更新模块
(10) 一系列工具类
五.UltimateAndroid
主要功能:
UltimateAndroid是一套集成了许多现有优秀的Android开源类库并将之组合成一个整体的Android快速开发框架。框架目前主要包含的功能有View Injection,ORM,异步网络请求和图片加载,自动化脚本测试,磁盘LRU等功能.同时提供了类似于TripleDes、Webview快速设置、Md5处理、String处理,Https处理等常用工具类,还有多种UI控件效果。并且这些功能正在逐步增加中。本套教程主要是介绍UltimateAndroid框架的使用,同时会采用一个项目作为例子来讲述如何更好的使用UltimateAndroid,也是一套Android快速开发的教程
1、部署UltimateAndroid框架(Eclipse版和AndroidStudio版)
2、导入DemoOfUi,实现多种UI效果
3、例程:项目介绍和初始化
4、启动效果处理
5、数据库结构处理
主要模块:
1.框架核心模块包括视图注入,ORM,异步的Http与图像请求等内容。
2.UltimateAndroid 使用了许多优秀的开源框架
3.目前的项目结构还未采用Gradle,可能在未来某一时间会采用
目前采用的核心开源类库有:
1.视图注入Butter Knife
2.异步网络请求 Asynchronous Http Client for Android.
3.异步图片加载Universal Image Loader for Android
4.ORM一:greenDAO
5.ORM二:ActiveAndroid
六.androidannotations
功能:完全注解框架,一切皆为注解:声明控件,绑定控件,设置监听,setcontentview,长按事件,异步线程,全部通过注解实现。
优点:完全的注解,使开发起来更加便利,程序员写的代码也更少。
缺点:文档是全英文的加上功能比较少没有具体研究,由于一切都是注解,感觉效率不高,不过根据官方介绍说并不是使用的反射加载,所以效率比一般注解高很多。
七.KJFrameForAndroid
功 能:一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用; KJFrameForAndroid开发框架的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实 现快速而又安全的开发APP。总共分为五大模 块:UILibrary,UtilsLibrary,HttpLibrary,BitmapLibrary,DBLibrary。
优点:功能比较全面,代码效率很高,文档完善,有项目demo,借鉴了很多大型框架经验。
缺点:框架的Activity部分最低,项目交流平台没多少人说话(难道大神都是不说话的?)
KJFrameForAndroid 又叫KJLibrary,是一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;
KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。我们提倡用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。
同时,KJFrameForAndroid是免费的、开源的、简易的、遵循Apache Licence 2.0开源协议发布的android应用开发框架,总共分为五大模 块:UILibrary,UtilsLibrary,HttpLibrary,BitmapLibrary,DBLibrary。
八.AndroidCommon
九.andbase
项目地址:https://github.com/zhaoqp2010/andbase/
项目地址:http://www.amsoft.cn/andbase.html
1.andbase中包含了大量的开发常用手段。
如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片文件下载上传,Http请求工具,SOAP工具类,异步Task,常用工具类(字符串,日期,文件处理,图片处理工具类等),能够使您的应用在团队开发中减少冗余代码,很大的提高了代码的维护性与开发高效性,能很好的规避由于开发疏忽而导致常犯的错误。
2.andbase封装了大量的常用控件。
如list分页,grid分页,下拉刷新,进度框,图片轮播,表格,多线程下载器,侧边栏,图片上传,*选择,图表,Tab滑动,日历选择器等。
3.强大的AbActivity,您没有理由不继承它。
继承它你能够获得一个简单强大可设置的操作栏,以及一系列的简单调用,如弹出框,提示框,进度框,副操作栏等。
4.提供效率较高图片缓存管理策略,使内存大幅度节省,利用率提高,效率提高。
程序中要管理大量的图片资源,andbase提供简单的方法,几步完成下载与显示,并支持缩放,裁剪,缓存功能,OOM不在有。
5.封装了大量常见工具类。
包括日期,字符,文件,图片,数学,View万能适配工具类等各种处理函数, 多而全。
6.用andbase大量减少handler的使用,而采用回调函数,代码更整洁。
handler会产生大量代码,并且不好维护,andbase对handler进行了封装,你会发现用了andbase基本代码中不会再有大量的handler判断语句。
7.简单轻量支持注解自动建表的ORM框架(支持一/多对多的关联操作)。
写sql,建表,工作量大,andbase提供更傻瓜异步增删改查工具类,数据库在内置卡和外置卡都可以。
8.异步请求http框架,网络请求标准化,支持文件上传下载,get,post,进度显示。
包含了异步与http请求的工具类,SOAP请求工具类,简单实用。