Java 复制Android';s画廊
目前正在开发一个微型应用程序,其目标是复制Android gallery,我无法让我的应用程序正常工作 事实上,作为使用画布的约束条件,我完全没有权利使用任何布局,我采取了不同的步骤,现在我将向大家解释,以解释问题: 1-我的主要活动是运行两个对象,一个“扫描”对象和一个“GalleryView”对象,这是两个个人类 2-扫描对象使用函数检索库中图像的所有路径 3-MainActivity恢复此arraylist并将其传递给my galleryview的生成器 4-gallery视图知道要显示的元素数(等于扫描返回的字符串arraylist的大小),并构建每个图像的位图以显示它们 这就是问题所在。事实上,我的手机上有大约480个图像,当我尝试显示它们时,查找GalleryView.java路径列表的位置是一个问题,因为它会使应用程序崩溃 如果我决定只画第一幅图像的480倍,它就行了 所以我想知道如何优化这种行为,以避免崩溃和内存过载 我的老师建议我们用BitmapDrawable代替位图,但我不知道如何实现它 您将在下面找到我的应用程序的所有类+大致解释渲染步骤的图表 MainActivity.javaJava 复制Android';s画廊,java,android,image,bitmap,Java,Android,Image,Bitmap,目前正在开发一个微型应用程序,其目标是复制Android gallery,我无法让我的应用程序正常工作 事实上,作为使用画布的约束条件,我完全没有权利使用任何布局,我采取了不同的步骤,现在我将向大家解释,以解释问题: 1-我的主要活动是运行两个对象,一个“扫描”对象和一个“GalleryView”对象,这是两个个人类 2-扫描对象使用函数检索库中图像的所有路径 3-MainActivity恢复此arraylist并将其传递给my galleryview的生成器 4-gallery视图知道要显示的
public class MainActivity extends AppCompatActivity {
//Objet qui va nous permettre de récuperer les images de la gallerie du téléphone
ScanPictures m_scan;
//liste des chemins des images de la gallerie
ArrayList<String>m_paths;
//objet qui permet d'afficher les images
GalleryView m_gallery;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//On créer l'object scanner pour récuperer les photos de la gallerie
m_scan = new ScanPictures(this.getApplicationContext());
//Boolean nous indiquant si l'application à l'autorisation d'accéder au contenu interne du téléphone
Boolean isAuthorized = this.isReadStoragePermissionGranted();
//Si on est authorisé, on scan la gallerie et on récuperer les chemins des photos
if(isAuthorized){
System.out.println("SCAN IMAGES ALREADY GRANTED");
m_paths = m_scan.getImages();
System.out.println("SCAN IMAGES ALREADY GRANTED DONE");
}
m_gallery = new GalleryView(this.getApplicationContext(),m_paths);
m_gallery.setPicturesNumber(m_paths.size());
setContentView(m_gallery);
}
public boolean isReadStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) { //le sdk est supérieur a 23, l'autorisation n'est pas donnée automatiquement
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
return true;
} else {
//L'autorisation n'est pas accordée, on la demande à l'utilisateur
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 3);
return false;
}
}
else { //les permissions sont automatiquement données en sdk < 23
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//SI l'utilisateur à donner l'autorisation, on scan les photos
if (requestCode == 3 ) {
System.out.println("SCAN IMAGES FIRST GRANTED");
this.m_scan.getImages();
System.out.println("SCAN IMAGES FIRST GRANTED DONE");
}
}
}
}
public class GalleryView extends View {
private GestureDetector mGestureDetector;
private ScaleGestureDetector mScaleGestureDetector;
private float mScale = 1;
private Bitmap resized =null;
private int numColumns, numRows, nbPict;
private int cellSize;
private ArrayList<String> m_paths;
private Context m_context;
public GalleryView(Context context, ArrayList<String> paths) {
super(context);
m_context = context;
m_paths = paths;
numColumns = 7;
mGestureDetector = new GestureDetector(context, new ZoomGesture());
mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGesture());
}
public void setPicturesNumber(int nbPict) {
this.nbPict = nbPict;
calculateDimensions();
}
private void calculateDimensions() {
numRows = nbPict/numColumns;
cellSize = getWidth() / numColumns;
invalidate();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
calculateDimensions();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.alterralogo);
int bitmapIndex = 0;
ArrayList<Bitmap> list = new ArrayList<>();
Bitmap bitmap = BitmapFactory.decodeFile(m_paths.get(0));
for(int i = 0 ; i< nbPict;i++){
list.add(BitmapFactory.decodeFile(m_paths.get(i))); //NOT OPTIMISED AT ALL, MAKE THE APP CRASH
}
for (int i = 0; i < numColumns; i++) {
for (int j = 0; j < numRows; j++) {
resized = Bitmap.createScaledBitmap(list.get(bitmapIndex), cellSize, cellSize, true);
canvas.drawBitmap(resized, i* cellSize, j * cellSize, null);
bitmapIndex++;
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mGestureDetector.onTouchEvent(event);
mScaleGestureDetector.onTouchEvent(event);
return true;
}
public class ZoomGesture extends GestureDetector.SimpleOnGestureListener {
private boolean normal = true;
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
}
public class ScaleGesture extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(numColumns !=1){
numColumns--;
calculateDimensions();
}
invalidate();
return true;
}
}
}
public class ScanPictures {
Context m_application_context;
public ScanPictures(Context activity_context){
m_application_context = activity_context;
}
public ArrayList<String> getImages(){
ArrayList<String> paths = new ArrayList<String>(); //liste qui va contenir les chemins vers les images de la gallerie
String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME };
String selection = MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " = ? ";
String selectionArgs[] = {"Camera"};
String orderBy = MediaStore.Images.Media.DATE_TAKEN;
//Stores all the images from the gallery in Cursor
Cursor cursor = m_application_context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, orderBy);
//Total number of images
int count = cursor.getCount();
//Create an array to store path to all the images
String[] arrPath = new String[count];
for (int i = 0; i < count; i++) {
cursor.moveToPosition(i);
int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
//Store the path of the image
arrPath[i]= cursor.getString(dataColumnIndex);
paths.add(arrPath[i]);
}
System.out.println(paths);
return paths;
}
}
公共类MainActivity扩展了AppCompatActivity{
//我们的目标是在电话的厨房里拍摄照片
扫描图片m_扫描;
//画廊图片列表
ArrayListm_路径;
//这是一张照片
GalleryView m_画廊;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//在créer l'object扫描仪上,为gallerie的照片倒杯
m_scan=新的扫描图片(this.getApplicationContext());
//布尔逻辑独立性是电话内部内容自动化的应用
布尔值isAuthorized=this.isReadStoragePermissionGrated();
//这是我的授权,这是我的照片
如果(未授权){
System.out.println(“已授权扫描图像”);
m_path=m_scan.getImages();
System.out.println(“已完成扫描图像”);
}
m_gallery=newGalleryView(this.getApplicationContext(),m_路径);
m_gallery.setPicturesNumber(m_path.size());
setContentView(美术馆);
}
公共布尔值IsReadStoragePermissionGrated(){
如果(Build.VERSION.SDK_INT>=23){//le SDK est supérieur a 23,则自动生成不属于自动请求
if(checkSelfPermission(Manifest.permission.READ\u外部存储)
==PackageManager.权限(已授予){
返回true;
}否则{
//自动化是一种协议,在使用需求上
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE},3);
返回false;
}
}
else{//les permissions sont automatiquement données en sdk<23
返回true;
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
//在扫描les照片上,我使用了donner l'autorisation
if(requestCode==3){
System.out.println(“先授权扫描图像”);
这个.m_scan.getImages();
System.out.println(“扫描图像首先授权完成”);
}
}
}
}
GalleryView.java
public class MainActivity extends AppCompatActivity {
//Objet qui va nous permettre de récuperer les images de la gallerie du téléphone
ScanPictures m_scan;
//liste des chemins des images de la gallerie
ArrayList<String>m_paths;
//objet qui permet d'afficher les images
GalleryView m_gallery;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//On créer l'object scanner pour récuperer les photos de la gallerie
m_scan = new ScanPictures(this.getApplicationContext());
//Boolean nous indiquant si l'application à l'autorisation d'accéder au contenu interne du téléphone
Boolean isAuthorized = this.isReadStoragePermissionGranted();
//Si on est authorisé, on scan la gallerie et on récuperer les chemins des photos
if(isAuthorized){
System.out.println("SCAN IMAGES ALREADY GRANTED");
m_paths = m_scan.getImages();
System.out.println("SCAN IMAGES ALREADY GRANTED DONE");
}
m_gallery = new GalleryView(this.getApplicationContext(),m_paths);
m_gallery.setPicturesNumber(m_paths.size());
setContentView(m_gallery);
}
public boolean isReadStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) { //le sdk est supérieur a 23, l'autorisation n'est pas donnée automatiquement
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
return true;
} else {
//L'autorisation n'est pas accordée, on la demande à l'utilisateur
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 3);
return false;
}
}
else { //les permissions sont automatiquement données en sdk < 23
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//SI l'utilisateur à donner l'autorisation, on scan les photos
if (requestCode == 3 ) {
System.out.println("SCAN IMAGES FIRST GRANTED");
this.m_scan.getImages();
System.out.println("SCAN IMAGES FIRST GRANTED DONE");
}
}
}
}
public class GalleryView extends View {
private GestureDetector mGestureDetector;
private ScaleGestureDetector mScaleGestureDetector;
private float mScale = 1;
private Bitmap resized =null;
private int numColumns, numRows, nbPict;
private int cellSize;
private ArrayList<String> m_paths;
private Context m_context;
public GalleryView(Context context, ArrayList<String> paths) {
super(context);
m_context = context;
m_paths = paths;
numColumns = 7;
mGestureDetector = new GestureDetector(context, new ZoomGesture());
mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGesture());
}
public void setPicturesNumber(int nbPict) {
this.nbPict = nbPict;
calculateDimensions();
}
private void calculateDimensions() {
numRows = nbPict/numColumns;
cellSize = getWidth() / numColumns;
invalidate();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
calculateDimensions();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.alterralogo);
int bitmapIndex = 0;
ArrayList<Bitmap> list = new ArrayList<>();
Bitmap bitmap = BitmapFactory.decodeFile(m_paths.get(0));
for(int i = 0 ; i< nbPict;i++){
list.add(BitmapFactory.decodeFile(m_paths.get(i))); //NOT OPTIMISED AT ALL, MAKE THE APP CRASH
}
for (int i = 0; i < numColumns; i++) {
for (int j = 0; j < numRows; j++) {
resized = Bitmap.createScaledBitmap(list.get(bitmapIndex), cellSize, cellSize, true);
canvas.drawBitmap(resized, i* cellSize, j * cellSize, null);
bitmapIndex++;
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mGestureDetector.onTouchEvent(event);
mScaleGestureDetector.onTouchEvent(event);
return true;
}
public class ZoomGesture extends GestureDetector.SimpleOnGestureListener {
private boolean normal = true;
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
}
public class ScaleGesture extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(numColumns !=1){
numColumns--;
calculateDimensions();
}
invalidate();
return true;
}
}
}
public class ScanPictures {
Context m_application_context;
public ScanPictures(Context activity_context){
m_application_context = activity_context;
}
public ArrayList<String> getImages(){
ArrayList<String> paths = new ArrayList<String>(); //liste qui va contenir les chemins vers les images de la gallerie
String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME };
String selection = MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " = ? ";
String selectionArgs[] = {"Camera"};
String orderBy = MediaStore.Images.Media.DATE_TAKEN;
//Stores all the images from the gallery in Cursor
Cursor cursor = m_application_context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, orderBy);
//Total number of images
int count = cursor.getCount();
//Create an array to store path to all the images
String[] arrPath = new String[count];
for (int i = 0; i < count; i++) {
cursor.moveToPosition(i);
int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
//Store the path of the image
arrPath[i]= cursor.getString(dataColumnIndex);
paths.add(arrPath[i]);
}
System.out.println(paths);
return paths;
}
}
公共类GalleryView扩展视图{
私人手势检测器mGestureDetector;
专用标尺检测器mScaleGestureDetector;
私人浮动mScale=1;
私有位图已调整大小=null;
私人int numColumns、numRows、nbPict;
私人单位;
私有数组列表m_路径;
私有语境m_语境;
公共GalleryView(上下文、ArrayList路径){
超级(上下文);
m_context=上下文;
m_路径=路径;
numColumns=7;
mGestureDetector=新的手势检测器(上下文,新的ZoomGeture());
mScaleGestureDetector=new-scalegstruedetector(上下文,new-scalegstrue());
}
公共无效设置图片编号(int nbPict){
this.nbPict=nbPict;
计算尺寸();
}
私有无效计算维度(){
numRows=nbPict/NUM列;
cellSize=getWidth()/numColumns;
使无效();
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
计算尺寸();
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
//位图Bitmap=BitmapFactory.decodeResource(getContext().getResources(),R.drawable.alteralogo);
int bitmapIndex=0;
ArrayList=新建ArrayList();
位图位图=BitmapFactory.decodeFile(m_path.get(0));
对于(int i=0;i