• Android设置拍照或者上传本地图片


    效果例如以下:


    看代码:

    MainActivity类中:

    package com.example.ceshidemo;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Calendar;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    	private static final int PHOTO_REQUEST_CAREMA = 1;
    	private static final int PHOTO_REQUEST_GALLERY = 2;
    	private static final int PHOTO_REQUEST_CUT = 3;
    	private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
    	private File tempFile;
    	private CircleImageView headIcon;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		initView();
    	}
    
    	private void initView() {
    		
    		headIcon = (CircleImageView) findViewById(R.id.headIcon);
    		headIcon.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				changeHeadIcon();
    			}
    		});
    		changeTheme();
    		File file = new File(MainActivity.this.getFilesDir(), "_head_icon.jpg");
    		if (file.exists()) {
    			headIcon.setImageURI(Uri.fromFile(file));
    		}
    	}
    	private void changeTheme() {
    		Calendar c = Calendar.getInstance();
    		System.out.println(c.get(Calendar.HOUR_OF_DAY));
    		if (c.get(Calendar.HOUR_OF_DAY) < 18 && c.get(Calendar.HOUR_OF_DAY) >= 6) {
    			headIcon.setImageResource(R.drawable.ic_hehe);
    		} else {
    			headIcon.setImageResource(R.drawable.ic_launcher);
    		}
    	}
    	private void changeHeadIcon() {
    		final CharSequence[] items = { "相冊", "拍照" };
    		AlertDialog dlg = new AlertDialog.Builder(MainActivity.this)
    				.setTitle("选择图片")
    				.setItems(items, new DialogInterface.OnClickListener() {
    					public void onClick(DialogInterface dialog, int item) {
    						// 这里item是依据选择的方式。
    						if (item == 0) {
    							Intent intent = new Intent(Intent.ACTION_PICK);
    							intent.setType("image/*");
    							startActivityForResult(intent,
    									PHOTO_REQUEST_GALLERY);
    						} else {
    							Intent intent = new Intent(
    									MediaStore.ACTION_IMAGE_CAPTURE);
    							if (Environment.getExternalStorageState().equals(
    									Environment.MEDIA_MOUNTED)) {
    								tempFile = new File(Environment
    										.getExternalStorageDirectory(),
    										PHOTO_FILE_NAME);
    								Uri uri = Uri.fromFile(tempFile);
    								intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    								startActivityForResult(intent,
    										PHOTO_REQUEST_CAREMA);
    							} else {
    								Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!",
    										Toast.LENGTH_SHORT).show();
    							}
    						}
    					}
    				}).create();
    		dlg.show();
    	}
    
    	@Override
    	public void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		if (requestCode == PHOTO_REQUEST_GALLERY) {
    			if (data != null) {
    				Uri uri = data.getData();
    				Log.e("图片路径??", data.getData() + "");
    				crop(uri);
    			}
    
    		} else if (requestCode == PHOTO_REQUEST_CAREMA) {
    			if (Environment.getExternalStorageState().equals(
    					Environment.MEDIA_MOUNTED)) {
    				crop(Uri.fromFile(tempFile));
    			} else {
    				Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!

    ", Toast.LENGTH_SHORT).show(); } } else if (requestCode == PHOTO_REQUEST_CUT) { if (data != null) { final Bitmap bitmap = data.getParcelableExtra("data"); headIcon.setImageBitmap(bitmap); // 保存图片到internal storage FileOutputStream outputStream; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); // out.close(); // final byte[] buffer = out.toByteArray(); // outputStream.write(buffer); outputStream = MainActivity.this.openFileOutput("_head_icon.jpg", Context.MODE_PRIVATE); out.writeTo(outputStream); out.close(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } try { if (tempFile != null && tempFile.exists()) tempFile.delete(); } catch (Exception e) { e.printStackTrace(); } } } private void crop(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 250); intent.putExtra("outputY", 250); intent.putExtra("outputFormat", "JPEG"); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", true); startActivityForResult(intent, PHOTO_REQUEST_CUT); } }

    在这里自定了一个圆形的View:CircleImageView

    package com.example.ceshidemo;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.BitmapShader;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.graphics.Shader;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.ColorDrawable;
    import android.graphics.drawable.Drawable;
    import android.net.Uri;
    import android.util.AttributeSet;
    import android.widget.ImageView;
    
    
    
    public class CircleImageView extends ImageView{
    
        private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
    
        private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
        private static final int COLORDRAWABLE_DIMENSION = 1;
    
        private static final int DEFAULT_BORDER_WIDTH = 0;
        private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
    
        private final RectF mDrawableRect = new RectF();
        private final RectF mBorderRect = new RectF();
    
        private final Matrix mShaderMatrix = new Matrix();
        private final Paint mBitmapPaint = new Paint();
        private final Paint mBorderPaint = new Paint();
    
        private int mBorderColor = DEFAULT_BORDER_COLOR;
        private int mBorderWidth = DEFAULT_BORDER_WIDTH;
    
        private Bitmap mBitmap;
        private BitmapShader mBitmapShader;
        private int mBitmapWidth;
        private int mBitmapHeight;
    
        private float mDrawableRadius;
        private float mBorderRadius;
    
        private boolean mReady;
        private boolean mSetupPending;
    
        public CircleImageView(Context context) {
            super(context);
    
            init();
        }
    
        public CircleImageView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
    
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
    
            mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
            mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
    
            a.recycle();
    
            init();
        }
    
        private void init() {
            super.setScaleType(SCALE_TYPE);
            mReady = true;
    
            if (mSetupPending) {
                setup();
                mSetupPending = false;
            }
        }
    
        @Override
        public ScaleType getScaleType() {
            return SCALE_TYPE;
        }
    
        @Override
        public void setScaleType(ScaleType scaleType) {
            if (scaleType != SCALE_TYPE) {
                throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
            }
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            if (getDrawable() == null) {
                return;
            }
    
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
            if (mBorderWidth != 0) {
                canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
            }
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            setup();
        }
    
        public int getBorderColor() {
            return mBorderColor;
        }
    
        public void setBorderColor(int borderColor) {
            if (borderColor == mBorderColor) {
                return;
            }
    
            mBorderColor = borderColor;
            mBorderPaint.setColor(mBorderColor);
            invalidate();
        }
    
        public int getBorderWidth() {
            return mBorderWidth;
        }
    
        public void setBorderWidth(int borderWidth) {
            if (borderWidth == mBorderWidth) {
                return;
            }
    
            mBorderWidth = borderWidth;
            setup();
        }
    
        @Override
        public void setImageBitmap(Bitmap bm) {
            super.setImageBitmap(bm);
            mBitmap = bm;
            setup();
        }
    
        @Override
        public void setImageDrawable(Drawable drawable) {
            super.setImageDrawable(drawable);
            mBitmap = getBitmapFromDrawable(drawable);
            setup();
        }
    
        @Override
        public void setImageResource(int resId) {
            super.setImageResource(resId);
            mBitmap = getBitmapFromDrawable(getDrawable());
            setup();
        }
    
        @Override
        public void setImageURI(Uri uri) {
            super.setImageURI(uri);
            mBitmap = getBitmapFromDrawable(getDrawable());
            setup();
        }
    
        private Bitmap getBitmapFromDrawable(Drawable drawable) {
            if (drawable == null) {
                return null;
            }
    
            if (drawable instanceof BitmapDrawable) {
                return ((BitmapDrawable) drawable).getBitmap();
            }
    
            try {
                Bitmap bitmap;
    
                if (drawable instanceof ColorDrawable) {
                    bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
                } else {
                    bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
                }
    
                Canvas canvas = new Canvas(bitmap);
                drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
                drawable.draw(canvas);
                return bitmap;
            } catch (OutOfMemoryError e) {
                return null;
            }
        }
    
        private void setup() {
            if (!mReady) {
                mSetupPending = true;
                return;
            }
    
            if (mBitmap == null) {
                return;
            }
    
            mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    
            mBitmapPaint.setAntiAlias(true);
            mBitmapPaint.setShader(mBitmapShader);
    
            mBorderPaint.setStyle(Paint.Style.STROKE);
            mBorderPaint.setAntiAlias(true);
            mBorderPaint.setColor(mBorderColor);
            mBorderPaint.setStrokeWidth(mBorderWidth);
    
            mBitmapHeight = mBitmap.getHeight();
            mBitmapWidth = mBitmap.getWidth();
    
            mBorderRect.set(0, 0, getWidth(), getHeight());
            mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
    
            mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
            mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
    
            updateShaderMatrix();
            invalidate();
        }
    
        private void updateShaderMatrix() {
            float scale;
            float dx = 0;
            float dy = 0;
    
            mShaderMatrix.set(null);
    
            if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
                scale = mDrawableRect.height() / (float) mBitmapHeight;
                dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
            } else {
                scale = mDrawableRect.width() / (float) mBitmapWidth;
                dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
            }
    
            mShaderMatrix.setScale(scale, scale);
            mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
    
            mBitmapShader.setLocalMatrix(mShaderMatrix);
        }
    
    }
    main_activity.xml文件:

    <?

    xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:circleimageView="http://schemas.android.com/apk/res/com.example.ceshidemo" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/bt_photo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拍照或者选择图片" > </TextView> <com.example.ceshidemo.CircleImageView android:id="@+id/headIcon" android:layout_width="65dp" android:layout_height="65dp" android:layout_gravity="center" android:layout_marginBottom="8dp" circleimageView:border_color="#ffffff" circleimageView:border_width="1dp" /> </LinearLayout>


    自己定义圆形的属性文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="DonutProgress">
            <attr name="donut_progress" format="integer"/>
            <attr name="donut_max" format="integer"/>
    
            <attr name="donut_unfinished_color" format="color"/>
            <attr name="donut_finished_color" format="color"/>
    
            <attr name="donut_finished_stroke_width" format="dimension"/>
            <attr name="donut_unfinished_stroke_width" format="dimension"/>
    
            <attr name="donut_text_size" format="dimension"/>
            <attr name="donut_text_color" format="color"/>
    
            <attr name="donut_prefix_text" format="string"/>
            <attr name="donut_suffix_text" format="string"/>
    
            <attr name="donut_background_color" format="color"/>
        </declare-styleable>
        <declare-styleable name="CircleImageView">
            <attr name="border_width" format="dimension" />
            <attr name="border_color" format="color" />
        </declare-styleable>
    </resources>

    上面全部代码,点击demo下载測试 :http://download.csdn.net/detail/onceing/8884045




  • 相关阅读:
    Xna小游戏开发【飞机空间大战】 碧血黄沙
    参考XNA官方Platformer模版,修改Platformer为横版可以滚动的小游戏 碧血黄沙
    云计算「半步巅峰」
    get_custom_field使用
    CCTM_FormElement 类
    php opendir说明
    js(chrome)打印对象函数
    operamasks.omItemSelector获取右边框ID方法
    {$vo.CreateDate|date="ymd H:i:s",###}
    添加xmlns:android="http://schemas.android.com/apk/res/android"的意思
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6752780.html
Copyright © 2020-2023  润新知