//实现照相
public void click1(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory().getPath(), "tu.png");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, 1);
}
//实现录像
public void click2(View v) {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory().getPath(), "to.mp4");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, 1);
}
2.fragment的入门
fragment理解成是Activity的一部分.
fragment必须嵌入到Activity里 .
fragment的生命周期和受到Activity的影响
ViewGroup :五大布局 可以有自己的孩子.
Fragment这个技术是在Android3.0被引进
在布局里面声明fragment
1.
2.
6.
11.
16.
fragment里面的name属性:要指定你声明的fragment,就是要加载这个fragment
声明fragment
1.//fragment代表Activity的一部分
2.public class Demo1Fragment extends Fragment {
3.
4. //在这个方法里面初始化Fragment要展示的内容 相当于Activity的onCreate方法
5. @Override
6. public View onCreateView(LayoutInflater inflater, ViewGroup container,
7. Bundle savedInstanceState) {
8. //[1]通过一个布局填充器 把一个布局转换成一个view对象
9. View view = inflater.inflate(R.layout.fragment_demo1, null);
10.
11. return view;
12. }
13.
14.}
3. 动态添加fragment
学过的manager: smsManager telephoneManager windowManager fragmentManager notifationManager packageManager ,ActivityManager.
public class MainActivity extends Activity {
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//[1]获取手机分辨率
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
//[2]获取fragment的管理者
FragmentManager fragmentManager = getFragmentManager();
//[3]开启事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
//说明是竖屏 当是竖屏的时候我加载一个fragment ★Android.代表都是系统定义好的 android.R.id.content:理解成是当前手机的窗体
if (width < height) {
transaction.replace(android.R.id.content, new Fragment_Demo1());
//说明是横屏 当是横屏的时候加载另外一个fragment
}else {
transaction.replace(android.R.id.content, new Fragment_Demo2());
}
//[4]一定要记得提交beginTransaction
transaction.commit();
}
}
4. 模拟一个微信的主页面
public void onClick(View v) {
// 获取fragment管理
FragmentManager manager = getFragmentManager();
// 开启事务
FragmentTransaction transaction = manager.beginTransaction();
switch (v.getId()) {
case R.id.bu_1:
transaction.replace(R.id.ll, new Fragment_wx());
break;
case R.id.bu_2:
transaction.replace(R.id.ll, new Fragment_friend());
break;
case R.id.bu_3:
transaction.replace(R.id.ll, new Fragment_discover());
break;
case R.id.bu_4:
transaction.replace(R.id.ll, new Fragment_me());
break;
}
transaction.commit();
}
5. fragment兼容低版本
[1]就是使用v4包中的fragment
[2]mainactivity要继承FragmentActivity
[3]获取Fragment的管理者方式不一样了
FragmentManager supportFragmentManager = getSupportFragmentManager();
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click1(View v) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction beginTransaction = manager.beginTransaction();
beginTransaction.replace(R.id.ll, new Fragment_wx());
beginTransaction.commit();
}
public void click2(View v) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction beginTransaction = manager.beginTransaction();
beginTransaction.replace(R.id.ll, new Fragment_friend());
beginTransaction.commit();
}
6.Fragment的生命周期
生命周期虽然很多 但是在实际开发中我们只需要重写2个方法就可以了 onCreteView和onDestroy方法
7. Fragment的通信
Fragment有一个公共桥梁 ---->Activity
代码1:
public class Fragment_1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_demo, null);
Button bu = (Button) view.findViewById(R.id.bu);
//获取点击事件
bu.setOnClickListener(new OnClickListener() {
@Override
//[3]修改另外一个Fragment的的textview 的内容
public void onClick(View v) {
Fragment_2 fragment = (Fragment_2) getActivity().getFragmentManager().findFragmentByTag("1");
fragment.update("我是刘");
}
});
return view;
}
}
。。。。 。。。。。。。。。。。。。。。。。。。。
代码2:
public class Fragment_2 extends Fragment {
private TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//[1]通过一个布局填充器 把一个布局转换成一个view对象
View view = inflater.inflate(R.layout.fragment_demo1, null);
tv = (TextView) view.findViewById(R.id.tv);
return view;
}
//更新textview的方法
public void update(String st) {
tv.setText(st);
}
}
main方法中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// [1]获取Fragment的管理者
FragmentManager manager = getFragmentManager();
FragmentTransaction beginTransaction = manager.beginTransaction();
// [2]动态替换
beginTransaction.replace(R.id.ll_1, new Fragment_1(), "2");
beginTransaction.replace(R.id.ll_2, new Fragment_2(), "1");
beginTransaction.commit();
}
8. menu菜单
添加菜单的方式
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 当点击手机上的menu菜单执行
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// getMenuInflater().inflate(R.menu.main, menu);
menu.add(1, 1, 0, "首页");
menu.add(1, 2, 0, "前进");
return true;
}
// 当想要知道具体菜单的哪个条目被选中 需要重写下面这个方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case 1:
System.out.println("111");
break;
case 2:
System.out.println("222");
break;
}
return super.onOptionsItemSelected(item);
}
// 当用户打开菜单的面板 这个方法就会执行
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("警告");
builder.setMessage("禁止下载");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
return false;
}
}
9. Android补间动画
[1]补间动画
位移
1.//创建一个位移动画 最后一个参数 慎用整数
2. TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.2f);
3. // [2]设置动画执行的时长
4. ta.setDuration(2000);
5.
6. //当动画执行完毕后 停留在结束位置
7. ta.setFillAfter(true);
8. // [3]iv执行动画
9. iv.startAnimation(ta);
旋转
1. RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
2. // [2]设置动画执行的时长
3. ra.setDuration(2000);
4. // [3]设置动画执行重复次数
5. ra.setRepeatCount(1);
6. // [4]设置重复的模式
7. ra.setRepeatMode(Animation.REVERSE);
8. // [3]iv执行动画
9. iv.startAnimation(ra);
缩放
1.// 缩放(放大 缩小)1.0默认
2. ScaleAnimation sa = new ScaleAnimation(1.0f, 3.0f, 1.0f, 3.0f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);
3. // [2]设置动画执行的时长
4. sa.setDuration(2000);
5. // [3]设置动画执行重复次数
6. sa.setRepeatCount(1);
7. // [4]设置重复的模式
8. sa.setRepeatMode(Animation.REVERSE);
9. // [3]iv执行动画
10. iv.startAnimation(sa);
透明
1.//[1]创建一个透明动画 1.0代表完全不透明 0.0完全透明
2. AlphaAnimation aa = new AlphaAnimation(1.0f, 0.0f);
3. //[2]设置动画执行的时长
4. aa.setDuration(2000);
5. //[3]设置动画执行重复次数
6. aa.setRepeatCount(1);
7. //[4]设置重复的模式
8. aa.setRepeatMode(Animation.REVERSE);
9. //[3]iv执行动画
10. iv.startAnimation(aa);
//综合,创建一个动画集合
public void click5(View v) {
AnimationSet set = new AnimationSet(true);
set.addAnimation(ts);
set.addAnimation(ra);
set.addAnimation(sc);
iv.startAnimation(set);
}
动画合集
补间动画的原理 :只是产生了一个动画效果而已 ,相当于孙悟空使用的障眼法.
10. 应用的反编译
apktools :获取apk资源文件(图片资源 布局资源 Android的清单文件)
dex2jar: 通过这个工具查看apk的源码
jd.exe:可以查看源码
11. 实现补间动画的第二种方式(使用xml来定义)
[1]res下创建一个anim目录
[2]在anim目录下创建对应的动画
// 点击按钮实现一个透明动画的效果
public void click1(View v) {
// [1]使用工具类来加载动画
Animation aa = AnimationUtils.loadAnimation(getApplicationContext(),
R.anim.alpha);
// [2]iv执行动画
iv.startAnimation(aa);
}
12. 通知栏
给用户友好提示
[1]Toast
[2]对话框
[3]通知栏
public class MainActivity extends Activity {
private NotificationManager nm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取通知的管理
nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
public void click1(View v) {
// [0]创建Notification实例 链式调用:
/*
* Notification noti = new Notification.Builder(this)
* .setContentTitle("我是大标题") .setContentText("我是大标题的内容")
* .setSmallIcon(R.drawable.ic_launcher)
* .setLargeIcon(BitmapFactory.decodeResource(getResources(),
* R.drawable.ic_launcher)) .build();
*/
// [0]在实际开发中为了兼容低版本 我们可以使用过时的方法
Notification noti = new Notification(R.drawable.ic_launcher, "收到信息",
System.currentTimeMillis());
// 当接收到通知 让手机震动 发出声音 让手机的呼吸灯亮
noti.defaults = Notification.DEFAULT_ALL;
// 当接收到通知 不让通知清除
noti.flags = Notification.FLAG_NO_CLEAR;
Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+111));
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 1, intent, Intent.FLAG_ACTIVITY_NEW_TASK );
// [0.3]当点击通知做对应的事情
noti.setLatestEventInfo(this, "小芳", "老地方见", contentIntent);
nm.notify(10, noti);
}
public void click2(View v) {
nm.cancel(10);
}
}
1.补间动画
位移 缩放 旋转 透明
补间动画原理:只是产生一个动画效果而已,实际坐标不变,
13.应用的反编译
apktools:获取apk资源文件(图片资源,布局资源Android清单文件)
dex2jar:通过这个工具查看apk源码
jd.exe:可以查看源码
逆向助手
14.属性动画
会改变控件的坐标
public class MainActivity extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
// iv.setRotationX(rotationX);
// iv.setAlpha(alpha);
// iv.setTranslationX(translationX);
// iv.setScaleX(scaleX);
}
// 旋转
public void click1(View v) {
ObjectAnimator ro = ObjectAnimator.ofFloat(iv, "rotationX", 10, 20, 40,
360);
ro.setDuration(2500);
ro.start();
}
// 透明
public void click2(View v) {
ObjectAnimator al = ObjectAnimator.ofFloat(iv, "alpha", 1f, 0.8f, 0.4f,
0f);
al.setDuration(2500);
al.start();
}
// 位移
public void click3(View v) {
ObjectAnimator ts = ObjectAnimator.ofFloat(iv, "translationX", 1f,
0.8f, 0.4f, -10f);
ts.setDuration(2500);
ts.start();
}
// 缩放
public void click4(View v) {
ObjectAnimator sc = ObjectAnimator.ofFloat(iv, "scaleX", 1f, 2f, 5f);
sc.setDuration(2500);
sc.start();
}
// 综合
public void click5(View v) {
AnimatorSet set = new AnimatorSet();
ObjectAnimator ts = ObjectAnimator.ofFloat(iv, "translationY", 1f, 200f);
ObjectAnimator sc = ObjectAnimator.ofFloat(iv, "scaleX", 2f, 5f);
ObjectAnimator ro = ObjectAnimator.ofFloat(iv, "rotationY", 40,
360,720);
set.setDuration(5000);
set.playTogether(ts, sc,ro);
//set.setTarget(iv);
set.start();
}
}