android摄像头开发

github 当前下载地址:https://github.com/Arikes/CameraAndroid.git

类 MResource

package com.example.camerademo;

import android.content.Context;

public class MResource {
	public static int getIdByName(Context context, String className, String name) {
		String packageName = context.getPackageName();
		Class r = null;
		int id = 0;
		try {
			r = Class.forName(packageName + ".R");

			Class[] classes = r.getClasses();
			Class desireClass = null;

			for (int i = 0; i < classes.length; ++i) {
				if (classes[i].getName().split("\\$")[1].equals(className)) {
					desireClass = classes[i];
					break;
				}
			}

			if (desireClass != null)
				id = desireClass.getField(name).getInt(desireClass);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}

		return id;
	}
}


资源单位类MediaItem

package com.example.camerademo;

import org.json.JSONException;
import org.json.JSONObject;

public class MediaItem {
	public enum MediaType {  
		PHOTO, MOVIE 
	} ;
	public static final String MEDIA_ITEM="media_item";
	private static final String ITEM_NAME="itemName";
	private static final String ITEM_PATH="itemPath";
	private static final String ITEM_ICONPATH="iconPath";
	private static final String ITEM_MEDIATYPE="mediaType";
	private String m_itemname;
	private String m_itempath;
	private String m_iconpath;
	private MediaType m_mediaType;
	
	public MediaItem(String itemname,String itempath,String iconpath,MediaType mediaType)
	{
		m_itemname=itemname;
		m_itempath=itempath;
		m_iconpath=iconpath;
		m_mediaType=mediaType;
	}
	
	public String getItemname() {
		return m_itemname;
	}
	public void setItemname(String itemname) {
		m_itemname = itemname;
	}
	public String getItempath() {
		return m_itempath;
	}
	public void setItempath(String itempath) {
		m_itempath = itempath;
	}
	public String getIconpath() {
		return m_iconpath;
	}
	public void setIconpath(String iconpath) {
		m_iconpath = iconpath;
	}
	public MediaType getMediaType() {
		return m_mediaType;
	}
	public void setMediaType(MediaType mediaType) {
		m_mediaType = mediaType;
	}
	public JSONObject toJson() throws JSONException
	{
		JSONObject json = new JSONObject();
		json.put(ITEM_NAME, m_itemname);
		json.put(ITEM_PATH, m_itempath);
		json.put(ITEM_ICONPATH, m_iconpath);
		json.put(ITEM_MEDIATYPE, m_mediaType);
		return json;
	}
}


主类CameraCtr

package com.example.camerademo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.json.JSONArray;
import org.json.JSONException;

import com.example.camerademo.MediaItem.MediaType;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.ImageButton;

public class CameraCtr extends Activity{
	public static final String TAG="CameraCtr";
	private ArrayList<MediaItem> mMedialist;
	private Camera mCamera;
	private SurfaceView mSurfaceView;
	private SurfaceHolder holder;
	private ImageButton mTake;
	private ImageButton mPosition;
	private ImageButton mRecord;
	private ImageButton mFlash;
	private ImageButton mZoom;
	private Chronometer mRecordTimer;
	private MediaRecorder mMediaRecorder;
	private ImageButton mStopRecord;
	private Button mMediaCount;
	private boolean bVidoMode;
	private boolean bFront;
	private boolean hasflash;
	private boolean bRecording;
	private int curZoom;
	
	private int mediaCount;
	
	private float startX = 0.0f,startY = 0.0f,endX = 0.0f,endY = 0.0f;
	
	private Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
		
		@Override
		public void onShutter() {
			// TODO Auto-generated method stub
			
		}
	};
	private Camera.PictureCallback mJpegCallback = new Camera.PictureCallback() {
		
		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			// TODO Auto-generated method stub
			String filename = "pic_"+newfilename()+".jpg";
//			File file = new File(Environment.getExternalStoragePublicDirectory(
//					Environment.DIRECTORY_DCIM), filename);

			FileOutputStream os = null;
			boolean success = true;
			try{
				os =CameraCtr.this.openFileOutput(filename,MODE_PRIVATE);
                File mRecAudioFile = new File(Environment.getExternalStoragePublicDirectory(
        				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename);
//				File mRecAudioFile= new File(dir.getAbsolutePath()+File.separator+filename);
                FileOutputStream fops = new FileOutputStream(mRecAudioFile);
                fops.write(data);
                
                fops.close();
			}catch(Exception e)
			{
				Log.e(TAG, "ERRER WRITE to file "+filename,e);
				success = false;
			}
			if(success)
			{
				Log.i(TAG, "JPEG saved at : "+filename);
				mediaCount++;
				mMediaCount.setText(String.valueOf(mediaCount));
			}
			MediaItem mediaitem= new MediaItem(filename,Environment.getExternalStoragePublicDirectory(
    				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,Environment.getExternalStoragePublicDirectory(
    	    				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,MediaType.PHOTO);
			mMedialist.add(mediaitem);
			Log.i(TAG, getApplicationContext().getFilesDir().getAbsolutePath());
			Log.i(TAG, getApplicationContext().getPackageResourcePath());
			mCamera.startPreview();
		}
	};
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		mediaCount=0;
		bFront = false;
		hasflash = false;
		bRecording=false;
		bVidoMode = true;
		curZoom = 1;
		mMedialist = new ArrayList<MediaItem>();
		super.onCreate(savedInstanceState);
		
//		setContentView(R.layout.activity_camera);
		setContentView(MResource.getIdByName(getApplication(), "layout", "activity_camera"));
		
//		Environment.getExternalStorageDirectory().getPath()
//		File file
		String albumName="moVdo";
		File dir = new File(Environment.getExternalStoragePublicDirectory(
				Environment.DIRECTORY_DCIM), albumName);
		if(!dir.exists())
			if(!dir.mkdir())
				Log.e(TAG, "don't create dir");
			else
				Log.i(TAG, "DIR is created");
		mRecordTimer = (Chronometer)findViewById(MResource.getIdByName(getApplication(), "id", "recordTimer"));
		if(bVidoMode)
			mRecordTimer.setVisibility(0x00000000);
		
		
		mMediaCount=(Button)findViewById(MResource.getIdByName(getApplication(), "id", "media_count"));
		
//		mTake = (ImageButton)findViewById(R.id.cameraBut);
		mTake = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraBut"));
		mTake.setOnTouchListener(new OnTouchListener(){

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
                if(event.getAction() == MotionEvent.ACTION_DOWN){    
                    //更改为按下时的背景图片    
                    v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cswitch"));
            }else if(event.getAction() == MotionEvent.ACTION_UP){    
                    //改为抬起时的图片    
            	v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cswitch_down"));
            }    
            return false;
			}});
		mTake.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
//				mCamera.takePicture(mShutterCallback, null, mJpegCallback);
				if(bRecording)
					return;
				
				bVidoMode = !bVidoMode;
				if(bVidoMode)
				{
					mRecordTimer.setVisibility(0x00000000);
					mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideo"));
				}
				else
				{
					mRecordTimer.setVisibility(0x00000004);//0x00000004
					mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cphoto"));
					}

			}
		});
//		mFlash =(ImageButton)findViewById(R.id.cameraFlash);
		mFlash = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraFlash"));
//		if(hasflash)
//			mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_on"));
//		else
//			mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_off"));
		mFlash.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if(hasflash)
					turnOfflight();
				else
					turnOnlight();
				hasflash=!hasflash;
//				if(hasflash)
//					mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_on"));
//				else
//					mFlash.setText(MResource.getIdByName(getApplication(), "string", "flashlight_off"));
			}
		});

//		mZoom = (ImageButton)findViewById(R.id.cameraZoom);
		mZoom = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraZoom"));
		mZoom.setOnTouchListener(new OnTouchListener()
		{

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
                if(event.getAction() == MotionEvent.ACTION_DOWN){    
                    //更改为按下时的背景图片    
                    v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cback_down"));    
            }else if(event.getAction() == MotionEvent.ACTION_UP){    
                    //改为抬起时的图片    
                    v.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cback"));    
            }
            return false;     
			}
			
		});
//		mZoom.setText(String.valueOf(curZoom));
		mZoom.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
//				setZoom();
				finish();
			}
		});
		
//		mPosition = (ImageButton)findViewById(R.id.cameraPosition);
		mPosition = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraPosition"));
		mPosition.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				int camera_num = Camera.getNumberOfCameras();
				if(camera_num<=1)
					return;
				
				mCamera.stopPreview();
				mCamera.release();
				mCamera = null;
				try{
					if(bFront)
						mCamera = Camera.open(0);
					else
						mCamera = Camera.open(1);
					}catch(Exception e)
				{
						mCamera.stopPreview();
						mCamera.release();
						mCamera = null;
						return;
				}
				bFront=!bFront;
				try {
					mCamera.setPreviewDisplay(holder);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				Camera.Parameters parameters = mCamera.getParameters();
				if(parameters==null)
					return ;
				int maxZoom=parameters.getMaxZoom();
				curZoom=parameters.getZoom();
				mCamera.setParameters(parameters);
				mCamera.startPreview();
			}
		});
		
//		mRecord = (ImageButton)findViewById(R.id.cameraRecord);
		mRecord = (ImageButton)findViewById(MResource.getIdByName(getApplication(), "id", "cameraRecord"));
		if(bVidoMode)
			mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideo"));
		else
			mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cphoto"));

		mRecord.setOnClickListener(new View.OnClickListener() {
			
			private File mRecAudioFile;

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if(bVidoMode)
				{
					if(bRecording)
					{
						//is recording ,need to stop
//						if(mediaCount<=2)
//							return;
						mMediaRecorder.stop();
						mRecordTimer.stop();
						mMediaRecorder.reset();
						mMediaRecorder.release();
						
						mCamera.lock();
						bRecording=false;
						mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideo"));
						mPosition.setEnabled(!bRecording);
					}
					else
					{
						//could start record movie
						prepareVideoRecorder();
						mMediaRecorder.start();
						bRecording=true;
						mPosition.setEnabled(!bRecording);
						mRecordTimer.setBase(SystemClock.elapsedRealtime());
						mRecordTimer.start();
						mRecord.setBackgroundResource(MResource.getIdByName(getApplication(), "drawable", "cvideopress"));
					}
				}
				else
				{
					mCamera.takePicture(mShutterCallback, null, mJpegCallback);
				}
			}
		});
		
//		mSurfaceView = (SurfaceView)findViewById(R.id.camera_surfaceView);
		mSurfaceView = (SurfaceView)findViewById(MResource.getIdByName(getApplication(), "id", "camera_surfaceView"));
		mSurfaceView.setOnTouchListener(new OnTouchListener()
		{

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
		        
		        if (event.getAction()==MotionEvent.ACTION_DOWN) {
		        	startX=event.getX();
		        	startY = event.getY();
		        	Log.d("aaa", "down pressed");
		        	return true;
		        }
		        else if(event.getAction()==MotionEvent.ACTION_MOVE)
		        {
		    		Log.i(TAG, Environment.getExternalStoragePublicDirectory(
		    				Environment.DIRECTORY_DCIM).getPath().toString());
		        	endX=event.getX();
		        	endY=event.getY();
		        	
		        	Log.d("curVAlue", "startX:"+(String.valueOf(startX))+"startY:"+String.valueOf(startY));
		        	Log.d("curVAlue", "endX:"+(String.valueOf(endX))+"endY:"+String.valueOf(endY));
		        	if(endY>startY)
		        		zoomSub();
		        	else
		        		zoomAdd();
		        	return true;
		        }
		        else if(event.getAction()==MotionEvent.ACTION_UP)
		        {
		        	endX=event.getX();
		        	endY=event.getY();
		        	if(startX==endX && startY==endY)
		        	{
		        		if (mCamera != null) {
		        			Rect rect = new Rect();
		        			rect.set((int)startX-15, (int)startY-15, (int)startX+15, (int)(startY+15));

		        			Parameters parameters = mCamera.getParameters();
		        			parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
		        			//				            parameters.setFocusAreas(Lists.newArrayList(new Camera.Area(rect, 500)));

		        			mCamera.setParameters(parameters);
		        			mCamera.autoFocus(null);
		        		}	
		        	}
		        	return true;
		        }
		        
				return true;
			}
			
		});
		
		holder = mSurfaceView.getHolder();
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		holder.addCallback(new SurfaceHolder.Callback() {
			
			@Override
			public void surfaceDestroyed(SurfaceHolder arg0) {
				// TODO Auto-generated method stub
				if(mCamera != null)
					mCamera.stopPreview();
			}
//			
			@Override
			public void surfaceCreated(SurfaceHolder arg0) {
				// TODO Auto-g/                                                                                                                                                                                                                                                                                                                                      enerated method stub
				try
				{
					if(mCamera != null){
						mCamera.setPreviewDisplay(holder);
					}
				}catch (IOException exception)
				{
					Log.e(TAG, "eRRER setting up preview display",exception);
				}
			}
			@Override
			public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
				// TODO Auto-generated method stub
				if(mCamera == null) return;
					mCamera.startPreview();
			}
		});
	}
	
	@Override
	public void onResume()
	{
		bRecording=false;
		Intent data = new Intent();
		data.putExtra(TAG, 1);
		this.setResult(1, data);
		super.onResume();
		if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD)
		{
			try{
				if(!bFront)
				{
					mCamera = Camera.open(0);
				}
				else
				{
					mCamera = Camera.open(1);
				}
				}catch(Exception e)
			{
				return;
				}
		}
		else
		{
			try{
			mCamera = Camera.open();}catch(Exception e)
			{
				return ;
				}
			if(mCamera == null)
				return;
		}
	}

	@Override
	public void onPause()
	{
		try {
			toJson();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		super.onPause();
		if(mCamera != null)
		{
			mCamera.release();
			mCamera = null;
		}
	}
	private boolean prepareVideoRecorder()
	{
		String albumName="moVdo";
		File dir = new File(Environment.getExternalStoragePublicDirectory(
				Environment.DIRECTORY_DCIM), albumName);
		if(!dir.exists())
			if(!dir.mkdir())
				Log.e(TAG, "don't create dir");
			else
				Log.i(TAG, "DIR is created");
		if(mCamera != null)
		{
		    mCamera.unlock();
			mMediaRecorder = new MediaRecorder();
			mMediaRecorder.reset();
		    mMediaRecorder.setCamera(mCamera);
		    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

		    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
		    if(!bFront)
		    	mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
		    else
		    	mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
            String filename ="video"+newfilename()+".mp4";
		    
            mMediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(
    				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename);
			MediaItem mediaitem= new MediaItem(filename,Environment.getExternalStoragePublicDirectory(
    				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,Environment.getExternalStoragePublicDirectory(
    	    				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename,MediaType.MOVIE);
			mediaCount++;
			mMediaCount.setText(String.valueOf(mediaCount));
			mMedialist.add(mediaitem);
		    
		    mMediaRecorder.setPreviewDisplay(holder.getSurface());
		    try {

		        mMediaRecorder.prepare();

		    } catch (IllegalStateException e) {

		        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());

		        mMediaRecorder.stop();
		        mMediaRecorder.reset();
		        mMediaRecorder.release();
		        mCamera.lock();
		        return false;

		    } catch (IOException e) {

		        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());

		        mMediaRecorder.stop();
		        mMediaRecorder.reset();
		        mMediaRecorder.release();
		        mCamera.lock();
		        return false;
		    }

		    return true;
		    
		}
		return false;
	}
	public void turnOnlight()
	{
		if(bFront)
			return;
		if(mCamera != null)
		{
			Camera.Parameters parameters = mCamera.getParameters();
			if(parameters ==null)
				return;
			List<String> flashModes = parameters.getSupportedFlashModes();
			String flashMode = parameters.getFlashMode();
			if(flashMode==null)
				return;
			if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
				// Turn on the flash
				if (flashModes.contains(Parameters.FLASH_MODE_TORCH))
				{
					parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
					mCamera.setParameters(parameters);
				} 
				else 
				{
				}
			}
		}
	}
	public void turnOfflight()
	{
		if(bFront)
			return;
		if(mCamera != null)
		{
			Camera.Parameters parameters = mCamera.getParameters();
			if(parameters ==null)
				return;
			List<String> flashModes = parameters.getSupportedFlashModes();
			String flashMode = parameters.getFlashMode();
			if(flashMode==null)
				return;
			if (!Parameters.FLASH_MODE_OFF.equals(flashMode)) {
				// Turn on the flash
				if (flashModes.contains(Parameters.FLASH_MODE_OFF)) {
					parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
					mCamera.setParameters(parameters);
				} else {
					Log.e(TAG, "FLASH_MODE_OFF not supported");
				}
			}
		}
	}

	public void zoomAdd()
	{
		if(mCamera ==null)
			return;
		Camera.Parameters parameters = mCamera.getParameters();
		if(parameters==null)
			return;
		int maxZoom=parameters.getMaxZoom();
		int curZoom=parameters.getZoom();
		if(curZoom<maxZoom)
		{
			curZoom++;
			parameters.setZoom(curZoom);
			mCamera.setParameters(parameters);
			return;
		}
	}
	public void zoomSub()
	{
		if(mCamera ==null)
			return;
		Camera.Parameters parameters = mCamera.getParameters();
		if(parameters==null)
			return;
		int curZoom=parameters.getZoom();
		if(curZoom>1)
		{
			curZoom--;
			parameters.setZoom(curZoom);
			mCamera.setParameters(parameters);
			return;
		}
	}
	private void setFocus(boolean bFocus)
	{
		if(mCamera!=null)
		{
			Camera.Parameters parameters = mCamera.getParameters();
			if(bFocus)
				parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
			else
				parameters.setFocusMode(Parameters.FOCUS_MODE_MACRO);;
//			parameters.setFocusAreas(focusAreas);
//			parameters.setFocusMode();
				mCamera.setParameters(parameters);
		}
	}
	private boolean toJson() throws JSONException
	{
		String filename = "movdoMedia.js";
		boolean success = false;
		try{
            File mJsonFile = new File(Environment.getExternalStoragePublicDirectory(
    				Environment.DIRECTORY_DCIM).getPath().toString()+File.separator+"moVdo"+File.separator+filename);
            FileOutputStream fops = new FileOutputStream(mJsonFile);
            JSONArray js_mediaArray= new JSONArray();
            if(mMedialist.isEmpty())
            {
            	fops.write(js_mediaArray.toString().getBytes());
                fops.close();
            	return true;
            }
    		for(MediaItem item:mMedialist)
    		{
    			js_mediaArray.put(item.toJson());
    		}
            fops.write(js_mediaArray.toString().getBytes());
            
            fops.close();
		}catch(Exception e)
		{
			Log.e(TAG, "ERRER WRITE to file "+filename,e);
			success = false;
		}
		return true;
	}
	private String newfilename()
	{
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String str=new String();
		str=df.format(new Date());
		return str;
	}
}

按钮 圆形配置文件

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 填充的颜色 -->
<solid android:color="#F5FFFA"/>
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="360dip"/>
<!-- padding: Button 里面的文字与Button边界的间隔 -->
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp"
/>
</shape>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值