آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

اسکرین شات گرفتن از لایه رلاتیو با عکس ها و متن های داخلش (((کمکککک))

صالحی  8 سال پیش  8 سال پیش
+3 0

سلام 

من چند کد رو استفاده کردم ولی به نتیجه کلی نرسیدم

لطفا راهنمایی کنید . من الان در یک اکتیوتی یه دکمه قرار دادم .منظور در قسمت xml

و در این xml  چند لایه قرار دادم که یکیش لایه رلاتیو هست که متن و عکس قرار داره داخل این لایه 

حالا میخوام با زدن دکمه یه عکس از لایه رلاتیو گرفته شه و هم زمان هم ذخیره کنه عکس رو در حافظه و  هم زمان به اشتراک هم بزاره .  لطفا راهنمایی کنید ..  خیلی با کد های تو سایت و جاهای دیگه سر و کله زدم ولی نتیجه ای نگرفتم 

 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
Amir  8 سال پیش
+6 0

اول متد زیر رو بنویسید:

private Bitmap takeScreenShot(View view) {
    view.setDrawingCacheEnabled(true);
    view.invalidate();
    Bitmap bitmap = view.getDrawingCache();

    return bitmap;
}

حالا اگه خواستید از کل صفحه اسکرین شات بگیرید باید متد بالا رو به این شکل صدا بزنید:

Bitmap bitmap = takeScreenShot(getWindow().getDecorView());

و اگه خواستید فقط از یه ویو مثل Button یا Relative Layout یا ... اسکرین شات بگیرید از کد زیر استفاده کنید:

ImageView img = (ImageView) findViewById(R.id.img);
Bitmap bitmap = takeScreenShot(img);

حالا اگه می خواید عکس گرفته شده رو توی یه ImageView نمایش بدید از کد زیر استفاده کنید:

img.setImageBitmap(bitmap);

حالا برای ذخیره کردن اول باید Bitmap که دارید رو با کد زیر به byte[] تبدیل کنید:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

برای ذخیره ی byte[] توی فایل:

        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream("/storage/sdcard0/picture.png"); // البته مطمئن نیستم که فرمت png هست یا چیز دیگه خودتون تست کنید
            outputStream.write(buffer, 0, buffer.length);
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.flush();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputStream.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

برای اشتراک گذاشتن هم توی Stackoverflow سرچ کنید.

0 0
تو این حالتی که شما گفتین اگه تکست ویویی داشته باشیم تو اون اکتیویتی که اسکرول می خوره ، بازهم کل متن تکست ویو رو اسکرین شات می گیره ؟؟ (8 سال پیش)
0 0
خب تست کنید ببینید میگیره؟ (8 سال پیش)
+1 0
احتمالا نمیشه، چون اگه یه تکست ویو باشه 1000 خط که نمیاد یه عکس یک کیلومتری بگیره. فقط ویویی که شما میبینید رو میگره. (8 سال پیش)
0 0
مرسی که دیر جواب دادم . خیلی مفید بود و پر بازده (8 سال پیش)
+1 0
ببخشین در کدهایی ک نوشتین ، buffer همون byteArray هستش ؟؟ و اینکه الان این اسکرین شات گرفته شده در گالری مثلا ذخیره میشه ؟؟ (8 سال پیش)
+1 0
آره همون Byte Array هست. برای ذخیره اسکرین شات از کد پایین ( پاسخ ) استفاده کنید. (8 سال پیش)
پاسخ به سوال 
صالحی  8 سال پیش
+1 0

فقط یه سوال برای کد زیر میخوام بگم وقتی اسکرین گرفت  مثلا به انگلیش بنویسه shot.png   و  برای بار دوم که اسکرین گرفت بنویسه shot2.png   یعنی اسکرین قبلی پاک نشه  و بشه بجاب عدد حروف به اسکرین داد. ممنون میشم راهنمایی کنید .

  public String SaveScreenshot(){
Random random = new Random();

String path = Environment.getExternalStorageDirectory().toString() + "/EidPics/";
File dir = new File(path);
if (!dir.exists())
dir.mkdirs();
Bitmap bitmap;
_root.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(_root.getDrawingCache());
_root.setDrawingCacheEnabled(false);
path += String.valueOf(random.nextInt(1000)) + ".png";
OutputStream fout = null;
File imageFile = new File(path);

try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fout);
fout.flush();
fout.close();

} catch (FileNotFoundException e) {
return null;
} catch (IOException e) {
return null;
}
return "file://" + imageFile.getAbsolutePath();

}


public void click (){
btshare.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String FileName = SaveScreenshot();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(FileName));
startActivity(Intent.createChooser(intent, getString(R.string.ShareBy)));
}
});
}
پاسخ به سوال 
Amir  8 سال پیش
+1 0

می تونید از کد زیر استفاده کنید که چک می کنه اگه وجود داشت یه شماره بعدش می نویسه:

File file = null;

for (int i = 0; i < 1000; i++) {
try {
    file = new File("/storage/sdcard0/picture" + i + ".png");
if (file.exists()) {
continue;
} else {
break;
}
} catch (Exception e) {}
}

بعد از این حلقه متغیر file اسمی که وجود نداره رو در بر داره.

0 0
دقیقا کجای کد باید قرار بدم ؟ (8 سال پیش)
+1 0
فک کنم باید اونجایی که نوشتید File imageFile = new Fle(path); این کد و کدهای قبلشو پاک کنید و به جاش کد بالا رو بنویسید. (8 سال پیش)
0 0
جواب نداد !!!!! (8 سال پیش)
+1 0
کد بالا رو حفظی نوشتم و تست نکردم، ممکنه مشکل داشته باشه. یه الگوریتم سادست خودتون راحت می تونید بنویسیدش. با کد imageFile.exists(); می تونید چک کنید که فایل وجود داره یا نه. (8 سال پیش)
0 0
کسی نظر دیگه ای نداره . برام خیلی مهمه ..کد ها رو بالا گذاشتم . چطور میتونم ویرایش کنم که تصویری که ذخیره میشه پشت هم باشه و قبلی رو حذف نکنه؟؟ (8 سال پیش)
0 0
دوستان؟؟؟؟؟؟؟ (8 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .