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

داینامیک کردن عکس ها!

h_r_v  12 سال پیش  12 سال پیش
+4 0

سلام، من از این کلاس برای قرار دادن عکس بین متن ها استفاده میکنم :

 public class TextViewWithImages extends TextView {

public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public TextViewWithImages(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextViewWithImages(Context context) {
super(context);

}
private void initialize() {
if (!isInEditMode()) {
String size = G.preferences.getString("FONT_SIZE", "20");

float size1 = Float.parseFloat(size);
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/bnazanin.ttf");
setTypeface(tf);
setTextSize(size1);
}
}
@Override
public void setText(CharSequence text, BufferType type) {
Spannable s = getTextWithImages(getContext(), text);
super.setText(s, BufferType.SPANNABLE);
initialize();
}

private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance();

private static boolean addImages(Context context, Spannable spannable) {
Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E");
boolean hasChanges = false;

Matcher matcher = refImg.matcher(spannable);
while (matcher.find()) {
boolean set = true;
for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
if (spannable.getSpanStart(span) >= matcher.start()
&& spannable.getSpanEnd(span) <= matcher.end()
) {
spannable.removeSpan(span);
} else {
set = false;
break;
}
}
String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim();
int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName());
if (set) {
hasChanges = true;
spannable.setSpan( new ImageSpan(context, id),
matcher.start(),
matcher.end(),

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
);

}
}

return hasChanges;
}
private static Spannable getTextWithImages(Context context, CharSequence text) {
Spannable spannable = spannableFactory.newSpannable(text);
addImages(context, spannable);
return spannable;
}
}

اما مشکل اینه که وقتی یه عکس میزارم اگه اندازه اش بیشتر از 300 یا 400 باشه duplicate میشه که هیچی! از صفحه هم میره بیرون! میخوام اگه راهی هست معرفی کنید که اندازه عکس ها را match_parent کنم با استفاده از این کلاس! ممنون

 

0 0
بیا بالا! (12 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
محمد حسین زاده  12 سال پیش
+5 0

کمی کلاس خودتو تغییر دادم (البته تو ادیتور سایت ، منظورم رسوندن ایده بود)

در موردش نظرتو بگو:

public class Parser extends LinearLayout {

private float textSize;

private Typeface typeface;

public Parser(Context context) {

super(context);
}

public Parser(Context context, AttributeSet attrs) {

super(context, attrs);
}

public void setText(String text) {

if (isInEditMode()) {

return;
}

String size = G.preferences.getString("FONT_SIZE", "20");

textSize = Float.parseFloat(size);

typeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/bnazanin.ttf");

Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E");

Matcher matcher = refImg.matcher(text);

while (matcher.find()) {

//Add TextView with textSize&typeface
//OR
//Add ImageView with custom configs
}
}
}

0 0
فکر کنم اینجوری میشه ImageView رو بیشتر شخصی سازی کرد! درسته؟ اما بلد نیستم کاملش کنم :دی (12 سال پیش)
0 0
کنترل کامل Image View دستته دیگه. تکمیل کن کد رو به جواب نرسیدی همین پست رو ادامه بده (12 سال پیش)
0 0
اصلا نمیتونم ادیتش کنم! چند تا مشکل داره! یکی اینکه میگه ifIsEditMode واسه Parser تعریف نشده! یکی میشه نمیشه واسه متد static از ImageView استفاده کرد و و... :دی تازه کارم حاجی (12 سال پیش)
0 0
پس یه ادیت دیگه برات میذارم (12 سال پیش)
0 0
کد رو یه باز بینی کردم و نیازی به ادیت مجدد ندیدم. isInEditMode برای LinearLayout موجوده , برای همه کلاسهای زیر مجموعه View موجوده. اون Parser هم یه اسمه. اگه باعث سردرگمی شده نام مناسب تری براش بذار. کلیات داستان هم اینه که برای متن ها یه تکست و برای عکس ها ImageView اضافه میکنی (12 سال پیش)
پاسخ به سوال 
h_r_v  12 سال پیش
0 0

برای اینکه از کد بالا استفاده کنید باید متنتون به این شکل باشه، البته HTML بودنش دلخواهیه!

 <html>
<head>
	<title></title>
</head>
<body>
<div style="direction: rtl;">
    <div>[img src=in/]</div>
    <div id="pastingspan1">Sample <strong>Text</strong> text - text - ...</div>
</div>
</body>
</html>
پاسخ به سوال 
محمد حسین زاده  12 سال پیش
+4 0

برای پارسی کردن (تجزیه کردن) html کد بالا قابل استفاده نیست

کدی قابل تجزیه هستش که تکه هاش به هم وابستگی نداشته باشن »

[img src=in/]
<div id="pastingspan1">Sample <strong>Text</strong> text - text - ...</div>
[img src=in/]
<div id="pastingspan1">Sample 2 <strong>Text</strong> text - text - ...</div>
[img src=in/]
<div id="pastingspan1">Sample 3 <strong>Text</strong> text - text - ...</div>

کد بالا قابل تجزیس - البته در صورتیکه بخوای تو کنترل های مختلف بذاریشون

پاسخ به سوال 
محمد حسین زاده  12 سال پیش
+7 0

برای تجزیه html مثال رو برای یه اکتیویتی نوشتم که تو layout فقط یه LinearLayout داره :

 public class MainActivity extends Activity {

private LinearLayout lilLayout;

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String html = "[img src=image1]" +
"<div>Sample 1 <strong>Text</strong> text - text - ...</div>" +
"[img src=image2]" +
"<div>Sample 2 <strong>Text</strong> text - text - ...</div>" +
"[img src=image3]" +
"<div>Sample 3 <strong>Text</strong> text - text - ...</div>";

lilLayout = (LinearLayout) findViewById(R.id.lilLayout);
Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q]\\E");
Matcher matcher = refImg.matcher(html);
int lastIndex = 0;
while (matcher.find()) {

String text = html.substring(lastIndex, matcher.start(1)).replace("[img src=", "").replace("]", "");
AddTextView(text);
String resname = html.substring(matcher.start(1), matcher.end(1));
AddImageView(resname);
lastIndex = matcher.end(1);
}

String text = html.substring(lastIndex, html.length()).replace("[img src=", "").replace("]", "");
AddTextView(text);
}

private void AddImageView(String resname) {

ImageView imageView = new ImageView(this);
int id = getResources().getIdentifier(resname, "drawable", getPackageName());
imageView.setImageResource(id);
lilLayout.addView(imageView);
}

private void AddTextView(String text) {

TextView textView = new TextView(this);
textView.setText(Html.fromHtml(text));
lilLayout.addView(textView);
}
}

با یه رشته html ثابت و فرضی با قوانینی که تو جواب قبلی گفتم شروع شده و تو هر مرحله بنا به نیاز متن یا تصویر به LinearLayout اضافه شدن.

برای مرتب کردن صفحه هم کافیه موارد مورد نیاز رو به 2 تا تابعی که وظیفه اضافه کردن عکس و متن رو دارن، اضافه کنیم


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