1、阴影:设置elevation 或translationZ属性

<TextView
android:id="@+id/tv_cicle"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/shape_oval"
android:elevation="@dimen/activity_horizontal_margin"
android:translationZ="@dimen/activity_horizontal_margin"
android:text="Hello World!" />

2、裁剪:

1)圆形

TextView textView = (TextView) findViewById(R.id.tv_cicle);
ViewOutlineProvider vop = new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setOval(0,0 , view.getWidth(), view.getHeight());
}
};
textView.setOutlineProvider(vop);
textView.setClipToOutline(true);

2)矩形

TextView tv_round = (TextView) findViewById(R.id.tv_round)
ViewOutlineProvider vop1 = new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0 , view.getWidth(), view.getHeight(), 25);
}
};
tv_round.setOutlineProvider(vop1);
tv_round.setClipToOutline(true);

3、Tint颜色合成模式

1)创建图片: bitmap_tint.xml

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/ring"
android:tintMode="multiply"
android:tint="#e324542"
/>

2)创建selector :bitmap_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bitmap_selector" android:state_pressed="true" />
<item android:drawable="@mipmap/ring" />
</selector>

3)设置到ImageView里

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bitmap_selector"
android:id="@+id/imageView"
android:layout_below="@+id/tv_cicle"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="32dp"
android:layout_marginStart="32dp"
android:layout_marginTop="134dp" />

4、使用vector绘制心形,m移动到,c贝塞尔曲线

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="264dp"
android:height="264dp"
android:viewportHeight="600"
android:viewportWidth="600">
<path
android:fillColor="#580f23"
android:pathData="M20.5,9.5
c-1.955,0,-3.83,1.268,-4.5,3
c-0.67,-1.732,-2.547,-3,-4.5,-3
C8.957,9.5,7,11.432,7,14
c0,3.53,3.793,6.257,9,11.5
c5.207,-5.242,9,-7.97,9,-11.5
C25,11.432,23.043,9.5,20.5,9.5z" />
</vector>

5、Button样式动画:

在xml定义

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button2"
android:background="?android:attr/selectableItemBackground"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button" />

------------------------------------------------------------------------------------------

在activity定义

Button button = (Button) findViewById(R.id.button3);
Animator animator = ViewAnimationUtils.createCircularReveal(button, button.getWidth()/2, button.getHeight()/2, button.getWidth(), button.getHeight() )
animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());
animator.start();

Button button4 = (Button) findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Animator animator = ViewAnimationUtils.createCircularReveal(view, 0, view.getHeight(),0, (float)Math.hypot(view.getWidth(), view.getHeight()));
animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());
animator.start();
}
});

6、Path动画

ImageView imageView = (ImageView) findViewById(R.id.iv_test);
Path path = new Path();
path.moveTo(100,100);
path.quadTo(1000, 300, 300, 700);

ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, View.X, View.Y, path);
Path p = new Path();
p.lineTo(0.6f, 0.9f);
p.lineTo(0.75f, 0.2f);
p.lineTo(1f, 1f);
animator.setInterpolator(new PathInterpolator(p));
animator.setDuration(3000);
animator.start();

7、Selector选择器里的属性动画

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/control_highlight_blue_grey">
<set>
<objectAnimator android:propertyName="translationZ"
android:duration="200"
android:valueTo="20dp"
android:valueType="floatType"/>
<objectAnimator android:propertyName="scaleX"
android:duration="200"
android:valueTo="0.5"
android:valueType="floatType"/>
<objectAnimator android:propertyName="scaleY"
android:duration="200"
android:valueTo="0.5"
android:valueType="floatType"/>
</set>
</item>
<item android:state_enabled="true" android:state_pressed="false" android:drawable="@color/button_normal_blue_grey">
<set>
<objectAnimator android:propertyName="translationZ"
android:duration="200"
android:valueTo="0"
android:valueType="floatType"/>
<objectAnimator android:propertyName="scaleX"
android:duration="200"
android:valueTo="1"
android:valueType="floatType"/>
<objectAnimator android:propertyName="scaleY"
android:duration="200"
android:valueTo="1"
android:valueType="floatType"/>
</set>
</item>
</selector>

8、CheckBox属性动画,图片轮播动画

<?xml version="1.0" encoding="utf-8"?>
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/pressed" android:drawable="@drawable/btn_check_15" android:state_pressed="true"/>
<item android:id="@+id/normal" android:drawable="@drawable/btn_check_0"/>
<transition android:fromId="@+id/normal" android:toId="@+id/pressed">
<animation-list>
<item android:duration="20" android:drawable="@drawable/btn_check_0"/>
<item android:duration="20" android:drawable="@drawable/btn_check_1"/>
<item android:duration="20" android:drawable="@drawable/btn_check_2"/>
<item android:duration="20" android:drawable="@drawable/btn_check_3"/>
<item android:duration="20" android:drawable="@drawable/btn_check_4"/>
<item android:duration="20" android:drawable="@drawable/btn_check_5"/>
<item android:duration="20" android:drawable="@drawable/btn_check_6"/>
<item android:duration="20" android:drawable="@drawable/btn_check_7"/>
<item android:duration="20" android:drawable="@drawable/btn_check_8"/>
<item android:duration="20" android:drawable="@drawable/btn_check_9"/>
<item android:duration="20" android:drawable="@drawable/btn_check_10"/>
<item android:duration="20" android:drawable="@drawable/btn_check_12"/>
<item android:duration="20" android:drawable="@drawable/btn_check_13"/>
<item android:duration="20" android:drawable="@drawable/btn_check_14"/>
<item android:duration="20" android:drawable="@drawable/btn_check_15"/>
</animation-list>
</transition>
</animated-selector>

9、矢量动画

1)先定义Paht动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="3000"
android:propertyName="pathData"
android:valueFrom="M67,750 L500,0 500,0 933,750 67,750 M146,853 A 0.1,500 0 0 1 146,148 M146,148 A 500,0.1 0 0 1 851,148 M851,148 A 0.1,500 0 0 1 851,853 M851,853 A 500,0.1 0 0 1 146,853"
android:valueTo="M147,853 L147,147 853,147 853,853 147,853 M146,853 A 0.1,500 0 0 1 146,148 M146,148 A 500,0.1 0 0 1 851,148 M851,148 A 0.1,500 0 0 1 851,853 M851,853 A 500,0.1 0 0 1 146,853"
android:valueType="pathType" />

<objectAnimator
android:startOffset="3000"
android:duration="3000"
android:propertyName="pathData"
android:valueFrom="M147,853 L147,147 853,147 853,853 147,853 M147,853 A 0.1,500 0 0 1 147,147 M147,147 A 500,0.1 0 0 1 853,147 M853,147 A 0.1,500 0 0 1 853,853 M851,853 A 500,0.1 0 0 1 147,853"
android:valueTo="M147,853 L147,147 853,147 853,853 147,853 M147,853 A 500,500 0 0 1 147,147 M147,147 A 500,500 0 0 1 853,147 M853,147 A 500,500 0 0 1 853,853 M853,853 A 500,500 0 0 1 147,853"
android:valueType="pathType" />
</set>

2)定义旋转动画

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="6000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="0" />

3)动画合成

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/vector_drawable" >
<target
android:name="vector"
android:animation="@anim/vector_anim" />

<target
android:name="rotation"
android:animation="@anim/vector_rotation" />
</animated-vector>

10、页面转场动画

public class TransitionsActivity extends Activity implements View.OnClickListener {
Button bt1,bt2,bt3,bt4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//getWindow().setAllowEnterTransitionOverlap(true);
//getWindow().setAllowReturnTransitionOverlap(true);
setContentView(R.layout.activity_transitions);


bt1 = (Button) findViewById(R.id.bt1);
bt2 = (Button) findViewById(R.id.bt2);
bt3 = (Button) findViewById(R.id.bt3);
bt4 = (Button) findViewById(R.id.bt4);

bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
bt3.setOnClickListener(this);
bt4.setOnClickListener(this);
}

@Override
public void onClick(View v) {
Intent intent = null;
Transition transition = null;
switch (v.getId()) {
case R.id.bt1:
//
transition = new Explode();
intent = new Intent(TransitionsActivity.this, ExplodeActivity.class);
break;
case R.id.bt2:
//淡入淡出
transition = new Fade();
intent = new Intent(TransitionsActivity.this, FadeActivity.class);
break;
case R.id.bt3:
//滑动
transition = new Slide();
intent = new Intent(TransitionsActivity.this, SlideActivity.class);
break;
case R.id.bt4:
break;

}

if (v.getId() != R.id.bt4) {
transition.setDuration(1000);
getWindow().setEnterTransition(transition);
getWindow().setExitTransition(transition);
getWindow().setReturnTransition(transition);
getWindow().setReenterTransition(transition);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(TransitionsActivity.this).toBundle());
} else {
TransitionSet set = new TransitionSet();
set.addTransition(new Explode());
set.addTransition(new Fade());
set.setDuration(1000);
getWindow().setReturnTransition(set);
getWindow().setReenterTransition(set);
getWindow().setEnterTransition(set);
getWindow().setExitTransition(set);

bt4.setTransitionName("bt4");
TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new ChangeTransform());
transitionSet.addTransition(new ChangeBounds());
transitionSet.addTarget("bt4");
transitionSet.setDuration(1000);
getWindow().setSharedElementEnterTransition(transitionSet);
getWindow().setSharedElementExitTransition(transitionSet);
getWindow().setSharedElementReturnTransition(transitionSet);
getWindow().setSharedElementReenterTransition(transitionSet);
intent = new Intent(this, ShareActivity.class);

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, bt4, "bt4");
startActivity(intent, options.toBundle());

}
}
}

11、下拉刷新SwipeRefreshLayout

1)布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#03A9F4"/>


<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:padding="5dp"
android:background="#eaeaea"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

2)实现:

public class WidgetActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener, MenuItem.OnMenuItemClickListener {

public static final int NONE = 0;
public static final int LIST_V = 1;
public static final int LIST_H = 2;
public static final int GRID_V = 3;
public static final int GRID_H = 4;
public static final int STAGGERED_GRID_V = 5;
public static final int STAGGERED_GRID_H = 6;

int mOrientation;
RecyclerView recyclerView;
SwipeRefreshLayout refreshLayout;
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOrientation = getIntent().getIntExtra("orientation", NONE);
setContentView(R.layout.widget_layout);
recyclerView = (RecyclerView) findViewById(R.id.recycler);
refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh);
refreshLayout.setOnRefreshListener(this);
refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
refreshLayout.setProgressBackgroundColor(R.color.refresh_bg);

toolbar = (Toolbar) findViewById(R.id.toolbar);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.user);
Bitmap b =createRoundConerImage(bitmap);
toolbar.setNavigationIcon(new BitmapDrawable(b));
//toolbar.setLogo(R.drawable.ic_launcher);
setActionBar(toolbar);

switch (mOrientation) {
case LIST_V:
initListView(true);
break;
case LIST_H:
initListView(false);
break;
case GRID_V:
initGridView(true);
break;
case GRID_H:
initGridView(false);
break;
case STAGGERED_GRID_V:
initStaggeredGridView(true);
break;
case STAGGERED_GRID_H:
initStaggeredGridView(false);
break;
}
}


private View initListView(boolean isVer) {
toolbar.setSubtitle(isVer ?"LinearLayoutManager Vertical":"LinearLayoutManager Horizontal");

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(isVer ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(new ListAdapter(this,isVer));

// recyclerView.setHasFixedSize(true);
recyclerView.setBackgroundColor(Color.WHITE);
return recyclerView;
}

private View initGridView(boolean isVer) {
toolbar.setSubtitle(isVer ?"GridLayoutManager Vertical":"GridLayoutManager Horizontal");
GridLayoutManager layoutManager = new GridLayoutManager(this,isVer ?3:4);
layoutManager.setOrientation(isVer ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);

recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(new GridAdapter(this,isVer));
return recyclerView;
}

private View initStaggeredGridView(boolean isVer) {
toolbar.setSubtitle(isVer ?"StaggeredGridLayoutManager Vertical":"StaggeredGridLayoutManager Horizontal");
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,isVer ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(new StaggeredGridAdapter(this,isVer));
return recyclerView;
}

@Override
public void onRefresh() {
refreshLayout.postDelayed(new Runnable() {
@Override
public void run() {
refreshLayout.setRefreshing(false);
}
},3000);
}

private String[] menuTitles;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (menuTitles == null) {
menuTitles = getResources().getStringArray(R.array.style_names);
}

for (String name : menuTitles){
MenuItem menuItem = menu.add(name);
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menuItem.setOnMenuItemClickListener(this);
}

return true;
}

@Override
public boolean onMenuItemClick(MenuItem item) {
for (int i = 0; i < menuTitles.length; i++) {

if (item.getTitle().equals(menuTitles[i])) {
Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
}
return false;
}
private Bitmap createRoundConerImage(Bitmap source) {
final Paint paint = new Paint();
paint.setAntiAlias(true);

int size = Math.min(source.getWidth(),source.getHeight());

Bitmap target = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, size, size);
canvas.drawRoundRect(rect, size /2, size/2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}

}

12、CardView有立体阴影的控件

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
card_view:cardBackgroundColor="@color/cardview_light_background"
card_view:cardCornerRadius="1dp" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" >

<ImageView
android:id="@+id/pic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop" />

<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/pic"
android:layout_centerHorizontal="true"
android:gravity="center"
android:textColor="#212121"
android:textSize="16sp" />
</RelativeLayout>

</android.support.v7.widget.CardView>

</RelativeLayout>