android拍照或相册选照片,裁剪,圆图处理(4.4变动后)

本文介绍了Android开发中处理拍照、从相册选取照片并进行裁剪,以及实现圆角头像的功能。面对产品需求,开发者通过自定义View控件和PopupWindow实现了iOS风格的底部弹窗效果。在实现过程中遇到了图片重复和数据为空的问题,这些问题仍有待后续完善和深入研究。
摘要由CSDN通过智能技术生成

项目催的实在太紧了,作为一个刚入门的Android新人,刚进公司就就得干活,问题还是没人带,只能硬着头皮做,不说了,说的都是泪,回归正题

关于拍照,获取相册相片,裁剪,网上有一大堆,不过弄了大半天,一个也没跑成,结果还是自己写,下面是几篇参照文章,非常感谢奉献者:


Android大图片裁剪终极解决方案(1-3)

这篇文章思路比较清晰,对于不了解的可以先看看,分上、中、下三篇。

看完上面的文章,原理和思路基本都清楚,这里我就不多说,直接上源码(公司用的,只能上部分):


一、首先应产品方面要求,要做成和ios一样,底部弹窗PopupWindow ,下面是代码,不是重点,


import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;

import com.caitu99.ifen.R;

/**
 * Created by Gray on 2015/6/30.
 */
public class SelectPicPopupWindow extends PopupWindow {

    private Button btn_take_photo, btn_pick_photo, btn_cancel;
    private View mMenuView;

    public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {
        super(context);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mMenuView = inflater.inflate(R.layout.ifen_me_face_photo, null);
        btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);
        btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);
        btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
        //取消按钮
        btn_cancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                //销毁弹出框
                dismiss();
            }
        });
        //设置按钮监听
        btn_pick_photo.setOnClickListener(itemsOnClick);
        btn_take_photo.setOnClickListener(itemsOnClick);
        //设置SelectPicPopupWindow的View
        this.setContentView(mMenuView);
        //设置SelectPicPopupWindow弹出窗体的宽
        this.setWidth(LayoutParams.FILL_PARENT);
        //设置SelectPicPopupWindow弹出窗体的高
        this.setHeight(LayoutParams.WRAP_CONTENT);
        //设置SelectPicPopupWindow弹出窗体可点击
        this.setFocusable(true);
        //设置SelectPicPopupWindow弹出窗体动画效果
        this.setAnimationStyle(R.style.myphotostyle);
        //实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0xb0000000);
        //设置SelectPicPopupWindow弹出窗体的背景
        this.setBackgroundDrawable(dw);
        //mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
        mMenuView.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {

                int height = mMenuView.findViewById(R.id.pop_layout).getTop();
                int y=(int) event.getY();
                if(event.getAction()==MotionEvent.ACTION_UP){
                    if(y<height){
                        dismiss();
                    }
                }
                return true;
            }
        });

    }

}


弹出与退出动画


<?xml version="1.0" encoding="utf-8" ?> 
 <set xmlns:android="http://schemas.android.com/apk/res/android">
  <translate android:duration="300" 
      android:fromXDelta="0" 
      android:fromYDelta="0" 
      android:toXDelta="0" 
      android:toYDelta="100%p" /> 
  </set>

<set xmlns:android="http://schemas.android.com/apk/res/android">
  <translate android:duration="300" 
         android:fromXDelta="0" 
         android:fromYDelta="100%p" 
         android:toXDelta="0" 
         android:toYDelta="0" /> 
  </set>

加上style

<style name="myphotostyle" parent="android:Animation">
  <item name="@android:windowEnterAnimation">@anim/popup_anim_in</item> 
  <item name="@android:windowExitAnimation">@anim/popup_anim_out</item> 
  </style>

PopupWindow 算完了。(原文,我已经找不到了,非常抱歉,原文作者看到了,请联系我)


二、在更换头像触发事件弹出PopupWindow:

 @Override
    public void onClick(View v) {
        if (v.getId() == R.id.ifen_mytest_btn) {
            menuWindow = new SelectPicPopupWindow(this, new View.OnClickListener() {

                public void onClick(View v) {
                    menuWindow.dismiss();
                    switch (v.getId()) {
                        case R.id.btn_take_photo:
                            takePhoto();
                            break;
                        case R.id.btn_pick_photo:
                            picPhoto();
                            break;
                        default:
                            break;
                    }
                }
            });
            //显示窗口
            menuWindow.showAtLocation(findViewById(R.id.ifen_matest), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
            //设置layout在PopupWindow中显示的位置
        }
    }

R.id.ifen_matest  这里是整个 activity  view


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值