Android自定义相机防拉伸问题,已入坑求解救!!! 10C

对于自定义相机,我们设置他的预览尺寸PreviewSize的时候,是要通过获取系统支持的预览尺寸getSupportedPreViewSize获得的。但是getSupportedPreViewSize集合,遍历每个尺寸的时候,都会发现他的宽度大于高度的,为了防止预览图像拉伸,我们是不是应该预览界面SurfaceView的宽度大于高度。但是又不科学,比如相机旋转90度,刚刚使我们正拿着手机的角度,此时高大于宽,但是系统相机全屏都是好好的,完全没有拉伸的。这到底是个什么情况,求解答!!!求脱坑!!!

2个回答

具体函数不熟,不妨大胆推测一下。
假定你的目标是全屏方式预览。
getSupportedPreViewSize 给的是横屏尺寸,而现在手持状态是竖屏;那么你要把尺寸高、宽交换,图片旋转90度显示。

Tiger_Zhao
Tiger_Zhao 回复kakuxwn: 换句话说,绘图函数已经自动调整为以持握方向为基准的坐标;而摄像头是按它自己为基准的坐标系;需要旋转图像来实现坐标转换。
3 年多之前 回复
Tiger_Zhao
Tiger_Zhao 回复kakuxwn: (继续大胆推测)对于摄像头硬件,它拍到的图像始终是“横屏”的(摄像头不会转啊);软件拿到这个图像,根据当前**屏幕**的持握方向,决定应该旋转0°、90°、180°、270°。
3 年多之前 回复
kakuxwn
kakuxwn 如果不进行旋转,手机横着拿拍摄景物是正的,但是旋转90度,手机正着拿拍摄景物是正的,但是尺寸不对了。要考虑到摄像头的拍摄角度和拉伸两个问题。
3 年多之前 回复

默认的本来就是横屏的呀,你开启camera的时候,有个mCamera.setDisplayOrientation,通过这个来设置就行了,你的surfaceView不用变的。
附上自己的camera开启参数。

     mCamera = Camera.open(mCamId);

        Camera.Parameters params = mCamera.getParameters();
        Camera.Size size = mCamera.new Size(mPreviewWidth, mPreviewHeight);
        if (!params.getSupportedPreviewSizes().contains(size) || !params.getSupportedPictureSizes().contains(size)) {
            Toast.makeText(getContext(), String.format("Unsupported resolution %dx%d", size.width, size.height), Toast.LENGTH_SHORT).show();
            stopCamera();
            return false;
        }

        if (params.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
            params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        }

        /***** set parameters *****/
        params.setPictureSize(mPreviewWidth, mPreviewHeight);
        params.setPreviewSize(mPreviewWidth, mPreviewHeight);
        int[] range = findClosestFpsRange(SrsEncoder.VFPS, params.getSupportedPreviewFpsRange());
        params.setPreviewFpsRange(range[0], range[1]);
        params.setPreviewFormat(ImageFormat.NV21);
        params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
        params.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
        if (!params.getSupportedFocusModes().isEmpty()) {
            params.setFocusMode(params.getSupportedFocusModes().get(0));
        }
        mCamera.setParameters(params);

        mCamera.setDisplayOrientation(mPreviewRotation);

        try {
            mCamera.setPreviewTexture(surfaceTexture);
            mCamera.setPreviewCallback(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.startPreview();

kakuxwn
kakuxwn 回复BigBigBrady: 我写了demo,没设预览尺寸,一样被拉伸了。。
3 年多之前 回复
qq_16445551
yuashuai 回复kakuxwn: 我就没有用SurfaceView,是用opengl绘制的,不明白为啥要弄surfaceView的宽高,surfaceView的宽高和preview的宽高是没有半毛关系的,你设置完orientation,传给surfaceView的自然不会被拉伸
3 年多之前 回复
kakuxwn
kakuxwn 你的代码应该是传进surfaceView的宽高,如果系统支持的该宽高,就进行下面的设置。不支持则就进行stopCamera吧。我这样说吧,activity强制横屏,此时摄像头不用旋转,也就是说不用setDisplayOrientation,但是在屏幕中间有一个长方形的surfaceview,高大于宽,手机横着的时候。此时你要设置previewSize以及pictureSize,这些都是要获取系统支持的,我们肯定要比对比例最合适的来设置。但是系统支持的都是宽大于高。比例不可能达到一致。必然拉伸的,你有没有懂我的意思。我们把sf设置成宽大于高,此时可以找到合适的比例。
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
android 不是自定义相机 打开系统相机 有切换相机和录制视频的功能

android 不是自定义相机 打开系统相机 有切换相机和录制视频的功能

Android相机自定义预览区大小

如图,我想在手机屏幕的某一块区域中做相机的预览,但是在竖屏情况下,人脸不能拉伸或收缩,要保持原来的比例,请问该怎么做,被这个问题困扰很久了 ![图片说明](https://img-ask.csdn.net/upload/201509/02/1441186234_609254.png)

android progressbar自定义样式

想给一个横向的进度条当前进度末端显示一个小圆点, 这个小圆点或者其他图片的样式是自定义的,随着当前进度的变化而移动,想请教一下这个要怎么实现呢?

Android拍视频预览的界面被拉伸

最近 Android 需要做一个拍视频保存然后上传的功能,基本功能实现了,但是有一个小 bug,就是预览的时候界面明显被拉长了,但是各种预览设置的参数也都试过了,都没有用,来请教一下。 #代码如下: ##1. Activity ``` public class RecordActivity extends AppCompatActivity implements SurfaceHolder.Callback { private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private Button btnStartStop; private boolean isRecording = false; // 标记是否已经在录制 private MediaRecorder mRecorder; // 音视频录制类 private Camera mCamera = null; // 相机 private List<Camera.Size> mSupportedPreviewSizes = null; private Camera.Size mPreviewSize; private Camera.Size mSize = null;// 相机的尺寸 private int mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; // 默认后置摄像头 private static final SparseIntArray orientations = new SparseIntArray(); // 手机旋转对应的调整角度 static { orientations.append(Surface.ROTATION_0, 90); orientations.append(Surface.ROTATION_90, 0); orientations.append(Surface.ROTATION_180, 270); orientations.append(Surface.ROTATION_270, 180); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initWindow(); setContentView(R.layout.activity_record); initViews(); } /** * 初始化窗口 */ private void initWindow() { requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 设置全屏 // 设置竖屏显示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 选择支持半透明模式,在有 surfaceView 的 activity 中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); } /** * 视图对象初始化 */ private void initViews() { mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); btnStartStop = (Button) findViewById(R.id.btnStartStop); btnStartStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isRecording) { startRecord(); } else { stopRecord(); } } }); SurfaceHolder holder = mSurfaceView.getHolder(); // 取得holder holder.setFormat(PixelFormat.TRANSPARENT); holder.setKeepScreenOn(true); holder.addCallback(this); // holder加入回调接口 } /** * 初始化相机 */ private void initCamera() { /** * 默认打开后置摄像头 */ if (Camera.getNumberOfCameras() == 2) { mCamera = Camera.open(mCameraFacing); } else { mCamera = Camera.open(); } CameraSizeComparator sizeComparator = new CameraSizeComparator(); Camera.Parameters parameters = mCamera.getParameters(); if (mSize == null) { mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); Collections.sort(mSupportedPreviewSizes, sizeComparator); for (int num = 0; num < mSupportedPreviewSizes.size(); num++) { Camera.Size size = mSupportedPreviewSizes.get(num); if (size.width >= 1000 && size.height >= 1000) { this.mSize = size; break; } } mSize = mSupportedPreviewSizes.get(0); /** * 增加对聚焦模式的判断 */ List<String> focusModesList = parameters.getSupportedFocusModes(); if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); } else if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); } mCamera.setParameters(parameters); } int rotation = getWindowManager().getDefaultDisplay().getRotation(); int orientation = orientations.get(rotation); mCamera.setDisplayOrientation(orientation); } @Override protected void onResume() { super.onResume(); initCamera(); } @Override public void onPause() { releaseCamera(); super.onPause(); } /** * 开始录制 */ private void startRecord() { if (mRecorder == null) { mRecorder = new MediaRecorder(); // 创建MediaRecorder } if (mCamera != null) { mCamera.stopPreview(); mCamera.unlock(); mRecorder.setCamera(mCamera); } try { // 设置音频采集方式 mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); // 设置视频的采集方式 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); /* mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置文件的输出格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置audio的编码格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 设置video的编码格式 mRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); // 设置录制的视频编码比特率 mRecorder.setVideoFrameRate(30); // 设置录制的视频帧率 mRecorder.setVideoSize(1920, 1080); // 设置相机分辨率 */ // 设置要捕获的视频的宽度和高度 // mSurfaceHolder.setFixedSize(optimalSize.width, optimalSize.height); mRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); // 设置记录会话的最大持续时间(毫秒) mRecorder.setMaxDuration(180 * 1000); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); /** * 获取外部路径,然后将视频保存进去 */ String path = Environment.getExternalStorageDirectory().getPath(); if (path != null) { File dir = new File(path + "/crafts_videos"); if (!dir.exists()) { dir.mkdir(); } /** * 将 currentTimeMillis() 作为文件名 */ path = dir + "/" + System.currentTimeMillis() + ".mp4"; mRecorder.setOutputFile(path); //设置输出文件的路径 mRecorder.prepare(); //准备录制 mRecorder.start(); //开始录制 isRecording = true; btnStartStop.setText("停止"); } } catch (Exception e) { e.printStackTrace(); } } /** * 停止录制 */ private void stopRecord() { try { mRecorder.stop(); // 停止录制 mRecorder.reset(); // 重置 btnStartStop.setText("开始"); } catch (Exception e) { e.printStackTrace(); } isRecording = false; } /** * 释放 MediaRecorder */ private void releaseMediaRecorder() { if (mRecorder != null) { mRecorder.release(); mRecorder = null; } } /** * 释放相机资源 */ private void releaseCamera() { try { if (mCamera != null) { mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.unlock(); mCamera.release(); } } catch (RuntimeException e) { } finally { mCamera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; if (mCamera == null) { return; } try { //设置显示 mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); releaseCamera(); finish(); } } @Override public void surfaceCreated(SurfaceHolder holder) { // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyed的时候同时对象设置为null if (isRecording && mCamera != null) { mCamera.lock(); } mSurfaceView = null; mSurfaceHolder = null; releaseMediaRecorder(); releaseCamera(); } private class CameraSizeComparator implements Comparator<Camera.Size> { public int compare(Camera.Size lhs, Camera.Size rhs) { if (lhs.width == rhs.width) { return 0; } else if (lhs.width > rhs.width) { return 1; } else { return -1; } } } } ``` ##2. 布局 ``` <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <SurfaceView android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/btnStartStop" android:layout_width="60dp" android:layout_height="40dip" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:text="开始" /> </RelativeLayout> ``` ##3. 权限 ``` <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 求大神解答

Android 相机预览尺寸且不变形

想定义一个方形的相机预览区域,包括可能要录制视频。 那么问题来了,如何保证预览的画面没有形变? 我想到了一种方案就是做一层不透明的覆盖,拍了图后,再切出来。这种方案仅对拍照片有效,如果是拍摄视频就无效了。 我想做的就是微信里的微视频的录制节目。 求大神支招。

可以拖动的半圆自定义进度条

# 今天项目中有一个要求,就是做一个自定义的半圆拖动进度条,![图片说明](https://img-ask.csdn.net/upload/201508/07/1438918573_10945.png) 效果图像这样, 上面的进度条 背景色渐变 中间白色 两变其他颜色 。下面的进度条是上面的关于X轴对称,且滑动方向相反。下面附上代码[](http://download.csdn.net/detail/merryassa/8972571 "") 源码效果是上面没有渐变色的样子 求大神帮忙。帮我看下代码,希望能多给点代码注释,谢谢啦!!!。

Android扫描二维码相机界面拉长问题

用ZXING开发了二维码扫描,单扫描的时候出现了如图情况,扫描界面不成比例,请大神指点,这个问题怎么处理

Android 中MediaRecorder+SurfaceView 录制视频的时图像变形

项目需要一个能录制十分钟左右自动停止的功能,找SDK发现满足不了需求,没办法就自己写了 基本都写完了,但是在录制的时候图像会拉伸变形,查了好多资料一直也没有一个好办法,现在 我解决了预览变形的,下面不知道怎么弄了,请教那位大神帮助一下 MediaRecorder配置类 if (!isRecorder && mMediaRecorder == null) { mMediaRecorder = new MediaRecorder(); try { mMediaRecorder.setCamera(mCamera); // 设置从摄像头采集图像 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER) mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // mMediaRecorder.setMaxDuration(1000); // 设置图像编码的格式 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); //Use myVideoSize from above mMediaRecorder.setVideoSize(320, 240); // 设置声音编码的格式 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制 /* * mMediaRecorder.setAudioChannels(1);//1单声道 2 多声道 * mMediaRecorder.setAudioSamplingRate(12500); * //设置录制的音频采样率——频率越高,音质越好 * mMediaRecorder.setAudioEncodingBitRate(16); // 设置录制的音频编码比特率 */ // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制 // 每秒 4帧 mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); // 文件输出路劲 mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath()); mMediaRecorder.setPreviewDisplay(mHolder.getSurface()); mMediaRecorder.prepare(); // mCamera.startPreview(); mMediaRecorder.start(); } 设置照相机 if (mCamera != null) { freeCameraResource(); } try { mCamera = Camera.open(); if(mCamera != null && isOpenCamera) setCameraParams(); mCamera.startPreview(); mCamera.setDisplayOrientation(0); mCamera.setPreviewDisplay(mHolder); mCamera.unlock(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 设置照相机 private void setCameraParams() { // TODO Auto-generated method stub if (mCamera != null) { params = mCamera.getParameters(); WindowManager manager = (WindowManager) VideotTranscribe.this.getSystemService(VideotTranscribe.this.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); // Point screenResolution = new Point(display.getWidth(), display.getHeight()); //Point p = getBestCameraResolution(params, screenResolution); params.setPreviewSize(display.getWidth(),display.getHeight());//防止录制预览图像变形 mCamera.setParameters(params); params = mCamera.getParameters(); } 跪求大神指导

相对布局背景不能拉伸填满整个屏幕

如图,我的布局背景不能拉伸填满整个屏幕: ![CSDN移动问答][1] XML文件如下: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#CACACA" android:orientation="vertical" > [1]: http://i.stack.imgur.com/fDMHK.png

android surfaceview横屏播放视频拉伸

自己写了一个简单的播放器,但是我竖屏拍摄的视频 会被拉伸变形成横屏播放 该如何让改,让视频正常显示

请教关于android camera 预览显示方向的一个问题。

请教关于android camera 预览显示方向的一个问题:有什么方法能够在android 1.6以上的设备都可以设置预览显示方向?

Android中如果防止TextView背景图片被拉伸

Android中TextView控件背景设置为图片时,能否不让图片随控件大小缩放,只按图片的实际大小显示?我的图片尺寸肯定小于TextView的尺寸,不想被拉伸。 最好是用代码实现,因为我需要根据不同情况设置不同的背景图。实在不行在xlm中定义也可以。 另,好几年没来CSDN了,以前的7000多积分好象不能用来提问悬赏了,实在没有C币了,不好意思!

请教一个问题,透明、可拉伸、拖动的文本编辑器,C# winform,如果用自定义控件,该怎么实现?

请教一个问题,透明、可拉伸、拖动的文本编辑器,C# winform,如果用自定义控件,该怎么实现? ![图片说明](https://img-ask.csdn.net/upload/201810/27/1540603358_122859.png)

为什么左右不能拉伸????

点九图,弄了半天,我做的图只能上下拉伸,不能左右拉伸, ![图片说明](https://img-ask.csdn.net/upload/201611/22/1479769062_910573.png) ![图片说明](https://img-ask.csdn.net/upload/201611/22/1479769074_552955.jpg)

设置壁纸,重启机器壁纸被拉伸变模糊

机器为七寸屏,壁纸设置为800X480,查看wallpaper_info.xml文件,width=800,height=480。重启机器,壁纸被拉伸,查看wallpaper_info.xml文件,width=800,height=800,请问大神们怎么解决

Android问题,求大神指导视频怎么按横屏全屏进行缩放~~~~~~~~~~!

如题~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!!

QT各个子窗口拉伸,一个子窗口拉伸另一个相应的缩小

就像一般大型的大型软件(如ISE)一样,在一个父窗口中有多个子窗口,每个子窗口都可以拉伸

自定义textView的placeHolder被拉伸怎么办

自定义textVIew的placeHolder(灰色文字部分)用quartz2D绘制 我监听键盘的高度 然后在监听方法里面改变textView高度 键盘弹出 textView的高度变小 键盘收回 高度变大 但是,键盘收缩,placeHolder的文字,会被短时间拉伸压缩 然后恢复正常 怎么办? ![图片说明](https://img-ask.csdn.net/upload/201510/18/1445100239_41495.jpg) ``` textView.m -(void)setPlaceHolder:(NSString *)placeHolder{ _placeHolder=placeHolder; self.change=YES; [self setNeedsDisplay]; } - (void)drawRect:(CGRect)rect { //设置textView代理 self.delegate=self; self.backgroundColor=[UIColor whiteColor]; //判断输入内容 NSString *str; if ((self.isChange==YES)&&(self.isClean==NO)) { str=self.placeHolder; //NSLog(@"1"); } if ((self.isChange==NO)&&(self.isClean==NO)) { str=@"请输入内容"; //NSLog(@"2"); } if (self.isClean==YES) { //NSLog(@"3"); str=@""; } //绘制画文字 NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; // NSForegroundColorAttributeName : 文字颜色 // NSFontAttributeName : 字体 attrs[NSForegroundColorAttributeName] = [UIColor grayColor]; if (self.fontSize) { attrs[NSFontAttributeName] = [UIFont systemFontOfSize:self.fontSize]; }else{ attrs[NSFontAttributeName] = [UIFont systemFontOfSize:14]; } [str drawAtPoint:CGPointMake(5, 8) withAttributes:attrs]; } #pragma mark - 监控textView开始 -(void)textViewDidChange:(UITextView *)textView{ //NSLog(@"4"); self.clean=YES; if (self.text.length==0) { self.clean=NO; } [self setNeedsDisplay]; } - (void)textViewDidBeginEditing:(UITextView *)textView{ //清空placeholder // NSLog(@"5"); self.clean=YES; if (self.text.length==0) { self.clean=NO; } [self setNeedsDisplay]; } #pragma mark - 监控textView结束 -(void)textViewDidEndEditing:(UITextView *)textView{ if (self.text.length==0) { //NSLog(@"6"); self.clean=NO; } [self setNeedsDisplay]; } ``` //controller.m ``` - (void)viewDidLoad { [super viewDidLoad]; self.placeHolderTextView.delegate=self; //隐藏tabbar self.tabBarController.tabBar.hidden=YES; //创建textView self.placeHolderTextView=[[IWTextView alloc]init]; CGFloat textViewX=0; CGFloat textViewY=CGRectGetMaxY(self.timeLabel.frame); CGFloat textViewW=self.view.bounds.size.width; CGFloat textViewH=self.view.bounds.size.height-textViewY; self.placeHolderTextView.frame=CGRectMake(textViewX,textViewY, textViewW, textViewH); //添加进父类 [self.view addSubview:self.placeHolderTextView]; //设置placeHolder self.placeHolderTextView.placeholder=@"请输入备忘事项"; //监听键盘的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; // MemoModel *model=[[MemoModel alloc]init]; // model.title=self.placeHolderTextView.text; // model.date=self.timeLabel.text; // NSLog(@"123"); } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; //键盘弹出 [self.placeHolderTextView becomeFirstResponder]; } #pragma mark - 键盘frame - (void)KeyboardWillShow:(NSNotification *)notification { //获取键盘frame CGRect keyboardFrame=[notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; //设置textView的frame CGRect textViewFrame=self.placeHolderTextView.frame; textViewFrame.size.height=CGRectGetMinY(keyboardFrame)-CGRectGetMaxY(self.timeLabel.frame); self.placeHolderTextView.frame=textViewFrame; NSLog(@"small%@",NSStringFromCGRect(self.placeHolderTextView.frame)); } - (IBAction)FinishAction:(UIBarButtonItem *)sender { //键盘退出 [self.view endEditing:YES]; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } ```

Android camera 预览变形

camera竖向预览,surfaceView是4:3,宽是屏幕宽度,高是屏幕宽度的3/4,previewSize也是4:3 的,但是预览还是变形,需要怎么处理呢![图片说明](https://img-ask.csdn.net/upload/201608/31/1472612016_57366.png)

定量遥感中文版 梁顺林著 范闻捷译

这是梁顺林的定量遥感的中文版,由范闻捷等翻译的,是电子版PDF,解决了大家看英文费时费事的问题,希望大家下载看看,一定会有帮助的

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

远程工具,免费

远程工具,免费

java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷

csma/ca和csma/cd的matlab仿真源代码带有详细的注释

csma/ca和csma/cd的matlab仿真源代码带有详细的注释,载波侦听,随意设置节点数,带有炫酷的图形展示效果。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

软件测试入门、SQL、性能测试、测试管理工具

软件测试2小时入门,让您快速了解软件测试基本知识,有系统的了解; SQL一小时,让您快速理解和掌握SQL基本语法 jmeter性能测试 ,让您快速了解主流来源性能测试工具jmeter 测试管理工具-禅道,让您快速学会禅道的使用,学会测试项目、用例、缺陷的管理、

pokemmo的资源

pokemmo必须的4个rom 分别为绿宝石 火红 心金 黑白 还有汉化补丁 资源不错哦 记得下载

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

Java8零基础入门视频教程

这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!

玩转Linux:常用命令实例指南

人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 --------------------------------------------------------------- 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。 &nbsp;

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

想学好JAVA必须要报两万的培训班吗? Java大神勿入 如果你: 零基础想学JAVA却不知道从何入手 看了一堆书和视频却还是连JAVA的环境都搭建不起来 囊中羞涩面对两万起的JAVA培训班不忍直视 在职没有每天大块的时间专门学习JAVA 那么恭喜你找到组织了,在这里有: 1. 一群志同道合立志学好JAVA的同学一起学习讨论JAVA 2. 灵活机动的学习时间完成特定学习任务+每日编程实战练习 3. 热心助人的助教和讲师及时帮你解决问题,不按时完成作业小心助教老师的家访哦 上一张图看看前辈的感悟: &nbsp; &nbsp; 大家一定迫不及待想知道什么是极简JAVA学习营了吧,下面就来给大家说道说道: 什么是极简JAVA学习营? 1. 针对Java小白或者初级Java学习者; 2. 利用9天时间,每天1个小时时间; 3.通过 每日作业 / 组队PK / 助教答疑 / 实战编程 / 项目答辩 / 社群讨论 / 趣味知识抢答等方式让学员爱上学习编程 , 最终实现能独立开发一个基于控制台的‘库存管理系统’ 的学习模式 极简JAVA学习营是怎么学习的? &nbsp; 如何报名? 只要购买了极简JAVA一:JAVA入门就算报名成功! &nbsp;本期为第四期极简JAVA学习营,我们来看看往期学员的学习状态: 作业看这里~ &nbsp; 助教的作业报告是不是很专业 不交作业打屁屁 助教答疑是不是很用心 &nbsp; 有奖抢答大家玩的很嗨啊 &nbsp; &nbsp; 项目答辩终于开始啦 &nbsp; 优秀者的获奖感言 &nbsp; 这是答辩项目的效果 &nbsp; &nbsp; 这么细致的服务,这么好的氛围,这样的学习效果,需要多少钱呢? 不要1999,不要199,不要99,只要9.9 是的你没听错,只要9.9以上所有就都属于你了 如果你: 1、&nbsp;想学JAVA没有基础 2、&nbsp;想学JAVA没有整块的时间 3、&nbsp;想学JAVA没有足够的预算 还等什么?赶紧报名吧,抓紧抢位,本期只招300人,错过只有等时间待定的下一期了 &nbsp; 报名请加小助手微信:eduxy-1 &nbsp; &nbsp;

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

linux下利用/proc进行进程树的打印

在linux下利用c语言实现的进程树的打印,主要通过/proc下的目录中的进程文件,获取status中的进程信息内容,然后利用递归实现进程树的打印

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

HoloLens2开发入门教程

本课程为HoloLens2开发入门教程,讲解部署开发环境,安装VS2019,Unity版本,Windows SDK,创建Unity项目,讲解如何使用MRTK,编辑器模拟手势交互,打包VS工程并编译部署应用到HoloLens上等。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干 目录 1-先去官网下载点击的MySQL的下载​ 2-配置初始化的my.ini文件的文件 3-初始化MySQL 4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

Ubuntu18.04安装教程

Ubuntu18.04.1安装一、准备工作1.下载Ubuntu18.04.1 LTS2.制作U盘启动盘3.准备 Ubuntu18.04.1 的硬盘空间二、安装Ubuntu18.04.1三、安装后的一些工作1.安装输入法2.更换软件源四、双系统如何卸载Ubuntu18.04.1新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列...

sql语句 异常 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your

在我们开发的工程中,有时候会报 [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ------ 这种异常 不用多想,肯定是我们的sql语句出现问题,下面...

西南交通大学新秀杯数学建模试题

题目比较难,如果符合大家的口味欢迎大家下载哈,提高你的思维想象能力

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

Spring Boot -01- 快速入门篇(图文教程)

Spring Boot -01- 快速入门篇 今天开始不断整理 Spring Boot 2.0 版本学习笔记,大家可以在博客看到我的笔记,然后大家想看视频课程也可以到【慕课网】手机 app,去找【Spring Boot 2.0 深度实践】的课程,令人开心的是,课程完全免费! 什么是 Spring Boot? Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot...

相关热词 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行 c# 循环给数组插入数据 c# 多线程死锁的例子 c# 钉钉读取员工排班 c# label 不显示 c#裁剪影像 c#工作进程更新ui
立即提问